import { getSheetIndex, getRangetxt } from '../methods/get'
import { replaceHtml, getObjType, chatatABC } from '../utils/util'
import formula from '../global/formula'
import { isRealNull, isEditMode } from '../global/validate'
import tooltip from '../global/tooltip'
import { luckysheetrefreshgrid } from '../global/refresh'
import { getcellvalue } from '../global/getdata'
import { genarate } from '../global/format'
import { modelHTML, luckysheet_CFiconsImg } from './constant'
import server from './server'
import { selectionCopyShow } from './select'
import sheetmanage from './sheetmanage'
import locale from '../locale/locale'
import { checkProtectionFormatCells } from './protection'
import Store from '../store'
import dayjs from 'dayjs'

//条件格式
const conditionformat = {
  fileClone: [],
  editorRule: null, //{"sheetIndex": sheetIndex,"itemIndex": itemIndex,"data": luckysheetfile[sheetIndex].luckysheet_conditionformat_save[itemIndex]}
  ruleTypeHtml: function() {
    const conditionformat_Text = locale().conditionformat

    return `<div class="ruleTypeBox">
                    <div class="ruleTypeItem">
                        <span class="icon lksticonfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem1}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon lksticonfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem2}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon lksticonfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem3}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon lksticonfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem4}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon lksticonfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem5}</span>
                    </div>
                    <div class="ruleTypeItem">
                        <span class="icon lksticonfont luckysheet-iconfont-youjiantou"></span>
                        <span>${conditionformat_Text.ruleTypeItem6}</span>
                    </div>
                </div>`
  },
  textCellColorHtml: function() {
    const conditionformat_Text = locale().conditionformat

    return `<div id="textCellColor">
                    <div class="colorbox">
                        <input id="checkTextColor" type="checkbox" checked="checked">
                        <label for="checkTextColor">${conditionformat_Text.textColor}：</label>
                        <input id="textcolorshow" data-tips="${conditionformat_Text.textColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#9c0006" style="display: none;">
                    </div>
                    <div class="colorbox">
                        <input id="checkCellColor" type="checkbox" checked="checked">
                        <label for="checkCellColor">${conditionformat_Text.cellColor}：</label>
                        <input id="cellcolorshow" data-tips="${conditionformat_Text.cellColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#ffc7ce" style="display: none;">
                    </div>
                </div>`
  },
  selectRange: [],
  selectStatus: false,
  dataBarList: [
    { format: ['#638ec6', '#ffffff'] }, //蓝-白渐变 数据条
    { format: ['#63c384', '#ffffff'] }, //绿-白渐变 数据条
    { format: ['#ff555a', '#ffffff'] }, //红-白渐变 数据条
    { format: ['#ffb628', '#ffffff'] }, //橙-白渐变 数据条
    { format: ['#008aef', '#ffffff'] }, //浅蓝-白渐变 数据条
    { format: ['#d6007b', '#ffffff'] }, //紫-白渐变 数据条

    { format: ['#638ec6'] }, //蓝色 数据条
    { format: ['#63c384'] }, //绿色 数据条
    { format: ['#ff555a'] }, //红色 数据条
    { format: ['#ffb628'] }, //橙色 数据条
    { format: ['#008aef'] }, //浅蓝色 数据条
    { format: ['#d6007b'] }, //紫色 数据条
  ],
  colorGradationList: [
    {
      format: ['rgb(99, 190, 123)', 'rgb(255, 235, 132)', 'rgb(248, 105, 107)'],
    }, //绿-黄-红色阶
    {
      format: ['rgb(248, 105, 107)', 'rgb(255, 235, 132)', 'rgb(99, 190, 123)'],
    }, //红-黄-绿色阶

    {
      format: ['rgb(99, 190, 123)', 'rgb(252, 252, 255)', 'rgb(248, 105, 107)'],
    }, //绿-白-红色阶
    {
      format: ['rgb(248, 105, 107)', 'rgb(252, 252, 255)', 'rgb(99, 190, 123)'],
    }, //红-白-绿色阶

    {
      format: ['rgb(90, 138, 198)', 'rgb(252, 252, 255)', 'rgb(248, 105, 107)'],
    }, //蓝-白-红色阶
    {
      format: ['rgb(248, 105, 107)', 'rgb(252, 252, 255)', 'rgb(90, 138, 198)'],
    }, //红-白-蓝色阶

    { format: ['rgb(252, 252, 255)', 'rgb(248, 105, 107)'] }, //白-红色阶
    { format: ['rgb(248, 105, 107)', 'rgb(252, 252, 255)'] }, //红-白色阶

    { format: ['rgb(99, 190, 123)', 'rgb(252, 252, 255)'] }, //绿-白色阶
    { format: ['rgb(252, 252, 255)', 'rgb(99, 190, 123)'] }, //白-绿色阶

    { format: ['rgb(99, 190, 123)', 'rgb(255, 235, 132)'] }, //绿-黄色阶
    { format: ['rgb(255, 235, 132)', 'rgb(99, 190, 123)'] }, //黄-绿色阶
  ],
  init: function() {
    let _this = this

    const conditionformat_Text = locale().conditionformat

    // 管理规则
    $(document)
      .off('change.CFchooseSheet')
      .on(
        'change.CFchooseSheet',
        '#luckysheet-administerRule-dialog .chooseSheet',
        function() {
          let index = $(
            '#luckysheet-administerRule-dialog .chooseSheet option:selected'
          ).val()
          _this.getConditionRuleList(index)
        }
      )
    $(document)
      .off('click.CFadministerRuleItem')
      .on(
        'click.CFadministerRuleItem',
        '#luckysheet-administerRule-dialog .ruleList .listBox .item',
        function() {
          $(this)
            .addClass('on')
            .siblings()
            .removeClass('on')
        }
      )

    $(document)
      .off('click.CFadministerRuleConfirm')
      .on(
        'click.CFadministerRuleConfirm',
        '#luckysheet-administerRule-dialog-confirm',
        function() {
          if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
            return
          }

          //保存之前的规则
          let fileH = $.extend(true, [], Store.luckysheetfile)
          let historyRules = _this.getHistoryRules(fileH)

          //保存当前的规则
          let fileClone = $.extend(true, [], _this.fileClone)
          const l = fileClone.length
          for (let c = 0; c < l; c++) {
            let sheetIndex = fileClone[c]['index']
            Store.luckysheetfile[getSheetIndex(sheetIndex)][
              'luckysheet_conditionformat_save'
            ] =
              fileClone[getSheetIndex(sheetIndex)][
                'luckysheet_conditionformat_save'
              ]
          }

          let fileC = $.extend(true, [], Store.luckysheetfile)
          let currentRules = _this.getCurrentRules(fileC)

          //刷新一次表格
          _this.ref(historyRules, currentRules)

          //隐藏一些dom
          $('#luckysheet-modal-dialog-mask').hide()
          $('#luckysheet-administerRule-dialog').hide()

          //发送给后台
          if (server.allowUpdate) {
            let files = $.extend(true, [], Store.luckysheetfile)
            for (let i = 0; i < files.length; i++) {
              server.saveParam(
                'all',
                files[i]['index'],
                files[i]['luckysheet_conditionformat_save'],
                { k: 'luckysheet_conditionformat_save' }
              )
            }
          }
        }
      )

    $(document)
      .off('click.CFadministerRuleClose')
      .on(
        'click.CFadministerRuleClose',
        '#luckysheet-administerRule-dialog-close',
        function() {
          $('#luckysheet-modal-dialog-mask').hide()
          $('#luckysheet-administerRule-dialog').hide()
          _this.fileClone = []
        }
      )
    $(document)
      .off('click.CFadministerRuleFa')
      .on(
        'click.CFadministerRuleFa',
        '#luckysheet-administerRule-dialog .item .fa-table',
        function() {
          $(this)
            .parents('#luckysheet-administerRule-dialog')
            .hide()

          let sheetIndex = $(
            '#luckysheet-administerRule-dialog .chooseSheet select option:selected'
          ).val()
          if (sheetIndex != Store.currentSheetIndex) {
            sheetmanage.changeSheetExec(sheetIndex)
          }

          let txt = $(this)
            .siblings('input')
            .val()
            .trim()
          let dataItem = $(this)
            .parents('.item')
            .attr('data-item')

          _this.multiRangeDialog(dataItem, txt)

          _this.selectRange = []

          let range = _this.getRangeByTxt(txt)
          if (range.length > 0) {
            for (let s = 0; s < range.length; s++) {
              let r1 = range[s].row[0],
                r2 = range[s].row[1]
              let c1 = range[s].column[0],
                c2 = range[s].column[1]

              let row = Store.visibledatarow[r2],
                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
              let col = Store.visibledatacolumn[c2],
                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

              _this.selectRange.push({
                left: col_pre,
                width: col - col_pre - 1,
                top: row_pre,
                height: row - row_pre - 1,
                left_move: col_pre,
                width_move: col - col_pre - 1,
                top_move: row_pre,
                height_move: row - row_pre - 1,
                row: [r1, r2],
                column: [c1, c2],
                row_focus: r1,
                column_focus: c1,
              })
            }
          }

          selectionCopyShow(_this.selectRange)
        }
      )
    $(document)
      .off('click.CFmultiRangeConfirm')
      .on(
        'click.CFmultiRangeConfirm',
        '#luckysheet-multiRange-dialog-confirm',
        function() {
          $(this)
            .parents('#luckysheet-multiRange-dialog')
            .hide()

          let dataItem = $(this).attr('data-item')
          let v = $(this)
            .parents('#luckysheet-multiRange-dialog')
            .find('input')
            .val()
          $(
            '#luckysheet-administerRule-dialog .item[data-item=' +
              dataItem +
              '] input'
          ).val(v)

          let sheetIndex = $(
            '#luckysheet-administerRule-dialog .chooseSheet option:selected'
          ).val()
          _this.fileClone[getSheetIndex(sheetIndex)][
            'luckysheet_conditionformat_save'
          ][dataItem].cellrange = _this.getRangeByTxt(v)

          $('#luckysheet-modal-dialog-mask').show()
          $('#luckysheet-administerRule-dialog').show()

          let range = []
          selectionCopyShow(range)
        }
      )
    $(document)
      .off('click.CFmultiRangeClose')
      .on(
        'click.CFmultiRangeClose',
        '#luckysheet-multiRange-dialog-close',
        function() {
          $(this)
            .parents('#luckysheet-multiRange-dialog')
            .hide()
          $('#luckysheet-modal-dialog-mask').show()
          $('#luckysheet-administerRule-dialog').show()

          $('#luckysheet-formula-functionrange-select').hide()
          $('#luckysheet-row-count-show').hide()
          $('#luckysheet-column-count-show').hide()

          let range = []
          selectionCopyShow(range)
        }
      )

    // 新建规则
    $(document)
      .off('click.CFnewConditionRule')
      .on('click.CFnewConditionRule', '#newConditionRule', function() {
        let sheetIndex = $(
          '#luckysheet-administerRule-dialog .chooseSheet option:selected'
        ).val()
        if (!checkProtectionFormatCells(sheetIndex)) {
          return
        }

        if (Store.luckysheet_select_save.length == 0) {
          if (isEditMode()) {
            alert(conditionformat_Text.pleaseSelectRange)
          } else {
            tooltip.info(conditionformat_Text.pleaseSelectRange, '')
          }
          return
        }

        _this.newConditionRuleDialog(1)
      })
    $(document)
      .off('click.CFnewConditionRuleConfirm')
      .on(
        'click.CFnewConditionRuleConfirm',
        '#luckysheet-newConditionRule-dialog-confirm',
        function() {
          if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
            return
          }

          let index = $(
            '#luckysheet-newConditionRule-dialog .ruleTypeItem.on'
          ).index()
          let type1 = $(
            '#luckysheet-newConditionRule-dialog #type1 option:selected'
          ).val()
          let type2 = $(
            '#luckysheet-newConditionRule-dialog .' +
              type1 +
              'Box #type2 option:selected'
          ).val()

          let format, rule
          if (index == 0) {
            if (type1 == 'dataBar') {
              //数据条
              let color = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find('.dataBarBox .luckysheet-conditionformat-config-color')
                .spectrum('get')
                .toHexString()

              if (type2 == 'gradient') {
                //渐变填充
                format = [color, '#ffffff']
              } else if (type2 == 'solid') {
                //实心填充
                format = [color]
              }

              rule = {
                type: 'dataBar',
                cellrange: $.extend(true, [], Store.luckysheet_select_save),
                format: format,
              }
            } else if (type1 == 'colorGradation') {
              //色阶
              let maxcolor = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find(
                  '.colorGradationBox .maxVal .luckysheet-conditionformat-config-color'
                )
                .spectrum('get')
                .toRgbString()
              let midcolor = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find(
                  '.colorGradationBox .midVal .luckysheet-conditionformat-config-color'
                )
                .spectrum('get')
                .toRgbString()
              let mincolor = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find(
                  '.colorGradationBox .minVal .luckysheet-conditionformat-config-color'
                )
                .spectrum('get')
                .toRgbString()

              if (type2 == 'threeColor') {
                //三色
                format = [maxcolor, midcolor, mincolor]
              } else if (type2 == 'twoColor') {
                //双色
                format = [maxcolor, mincolor]
              }

              rule = {
                type: 'colorGradation',
                cellrange: $.extend(true, [], Store.luckysheet_select_save),
                format: format,
              }
            } else if (type1 == 'icons') {
              //图标集
              let len = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find('.iconsBox .model')
                .attr('data-len')
              let leftMin = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find('.iconsBox .model')
                .attr('data-leftmin')
              let top = $(this)
                .parents('#luckysheet-newConditionRule-dialog')
                .find('.iconsBox .model')
                .attr('data-top')

              format = {
                len: len,
                leftMin: leftMin,
                top: top,
              }

              rule = {
                type: 'icons',
                cellrange: $.extend(true, [], Store.luckysheet_select_save),
                format: format,
              }
            }
          } else {
            let conditionName = '',
              conditionRange = [],
              conditionValue = []

            if (index == 1) {
              if (type1 == 'number') {
                //单元格值
                conditionName = type2

                if (type2 == 'betweenness') {
                  let v1 = $(
                    '#luckysheet-newConditionRule-dialog #conditionVal input'
                  )
                    .val()
                    .trim()
                  let v2 = $(
                    '#luckysheet-newConditionRule-dialog #conditionVal2 input'
                  )
                    .val()
                    .trim()

                  //条件值是否是选区
                  let rangeArr1 = _this.getRangeByTxt(v1)
                  if (rangeArr1.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  } else if (rangeArr1.length == 1) {
                    let r1 = rangeArr1[0].row[0],
                      r2 = rangeArr1[0].row[1]
                    let c1 = rangeArr1[0].column[0],
                      c2 = rangeArr1[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                      v1 = getcellvalue(r1, c1, Store.flowdata)

                      conditionRange.push({
                        row: rangeArr1[0].row,
                        column: rangeArr1[0].column,
                      })
                      conditionValue.push(v1)
                    } else {
                      _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                      return
                    }
                  } else if (rangeArr1.length == 0) {
                    if (isNaN(v1) || v1 == '') {
                      _this.infoDialog(
                        conditionformat_Text.conditionValueCanOnly,
                        ''
                      )
                      return
                    } else {
                      conditionValue.push(v1)
                    }
                  }

                  let rangeArr2 = _this.getRangeByTxt(v2)
                  if (rangeArr2.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  } else if (rangeArr2.length == 1) {
                    let r1 = rangeArr2[0].row[0],
                      r2 = rangeArr2[0].row[1]
                    let c1 = rangeArr2[0].column[0],
                      c2 = rangeArr2[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                      v2 = getcellvalue(r1, c1, Store.flowdata)

                      conditionRange.push({
                        row: rangeArr2[0].row,
                        column: rangeArr2[0].column,
                      })
                      conditionValue.push(v2)
                    } else {
                      _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                      return
                    }
                  } else if (rangeArr2.length == 0) {
                    if (isNaN(v2) || v2 == '') {
                      _this.infoDialog(
                        conditionformat_Text.conditionValueCanOnly,
                        ''
                      )
                      return
                    } else {
                      conditionValue.push(v2)
                    }
                  }
                } else {
                  //条件值
                  let v = $(
                    '#luckysheet-newConditionRule-dialog #conditionVal input'
                  )
                    .val()
                    .trim()

                  //条件值是否是选区
                  let rangeArr = _this.getRangeByTxt(v)
                  if (rangeArr.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  } else if (rangeArr.length == 1) {
                    let r1 = rangeArr[0].row[0],
                      r2 = rangeArr[0].row[1]
                    let c1 = rangeArr[0].column[0],
                      c2 = rangeArr[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                      v = getcellvalue(r1, c1, Store.flowdata)

                      conditionRange.push({
                        row: rangeArr[0].row,
                        column: rangeArr[0].column,
                      })
                      conditionValue.push(v)
                    } else {
                      _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                      return
                    }
                  } else if (rangeArr.length == 0) {
                    if (isNaN(v) || v == '') {
                      _this.infoDialog(
                        conditionformat_Text.conditionValueCanOnly,
                        ''
                      )
                      return
                    } else {
                      conditionValue.push(v)
                    }
                  }
                }
              } else if (type1 == 'text') {
                //特定文本
                conditionName = 'textContains'

                //条件值
                let v = $(
                  '#luckysheet-newConditionRule-dialog #conditionVal input'
                )
                  .val()
                  .trim()

                //条件值是否是选区
                let rangeArr = _this.getRangeByTxt(v)
                if (rangeArr.length > 1) {
                  _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                  return
                } else if (rangeArr.length == 1) {
                  let r1 = rangeArr[0].row[0],
                    r2 = rangeArr[0].row[1]
                  let c1 = rangeArr[0].column[0],
                    c2 = rangeArr[0].column[1]

                  if (r1 == r2 && c1 == c2) {
                    v = getcellvalue(r1, c1, Store.flowdata)

                    conditionRange.push({
                      row: rangeArr[0].row,
                      column: rangeArr[0].column,
                    })
                    conditionValue.push(v)
                  } else {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  }
                } else if (rangeArr.length == 0) {
                  if (v == '') {
                    _this.infoDialog(
                      conditionformat_Text.conditionValueCanOnly,
                      ''
                    )
                    return
                  } else {
                    conditionValue.push(v)
                  }
                }
              } else if (type1 == 'date') {
                //发生日期
                conditionName = 'occurrenceDate'

                //条件值
                let v = $(
                  '#luckysheet-newConditionRule-dialog #daterange-btn'
                ).val()

                if (v == '' || v == null) {
                  _this.infoDialog(conditionformat_Text.pleaseSelectADate, '')
                  return
                }

                conditionValue.push(v)
              }
            } else if (index == 2) {
              //排名靠前靠后
              //条件名称
              if (type1 == 'top') {
                if (
                  $('#luckysheet-newConditionRule-dialog #isPercent').is(
                    ':selected'
                  )
                ) {
                  conditionName = 'top10%'
                } else {
                  conditionName = 'top10'
                }
              } else if (type1 == 'last') {
                if (
                  $('#luckysheet-newConditionRule-dialog #isPercent').is(
                    ':selected'
                  )
                ) {
                  conditionName = 'last10%'
                } else {
                  conditionName = 'last10'
                }
              }

              //条件值
              let v = $(
                '#luckysheet-newConditionRule-dialog #conditionVal input'
              )
                .val()
                .trim()

              if (parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000) {
                _this.infoDialog(conditionformat_Text.pleaseEnterInteger, '')
                return
              }

              conditionValue.push(parseInt(v))
            } else if (index == 3) {
              //平均值
              if (type1 == 'AboveAverage') {
                conditionName = 'AboveAverage'
                conditionValue.push('AboveAverage')
              } else if (type1 == 'SubAverage') {
                conditionName = 'SubAverage'
                conditionValue.push('SubAverage')
              }
            } else if (index == 4) {
              //重复值
              conditionName = 'duplicateValue'
              conditionValue.push(type1)
            } else if (index == 5) {
              //公式
              conditionName = 'formula'

              //条件值
              let v = $(
                '#luckysheet-newConditionRule-dialog #formulaConditionVal input'
              )
                .val()
                .trim()

              if (v == '') {
                _this.infoDialog('Condition value cannot be empty!', '')
                return
              }

              conditionValue.push(v)
            }

            //格式颜色
            let textcolor
            if (
              $('#luckysheet-newConditionRule-dialog #checkTextColor').is(
                ':checked'
              )
            ) {
              textcolor = $(
                '#luckysheet-newConditionRule-dialog #textcolorshow'
              )
                .spectrum('get')
                .toHexString()
            } else {
              textcolor = null
            }

            let cellcolor
            if (
              $('#luckysheet-newConditionRule-dialog #checkCellColor').is(
                ':checked'
              )
            ) {
              cellcolor = $(
                '#luckysheet-newConditionRule-dialog #cellcolorshow'
              )
                .spectrum('get')
                .toHexString()
            } else {
              cellcolor = null
            }

            format = {
              textColor: textcolor,
              cellColor: cellcolor,
            }

            rule = {
              type: 'default',
              cellrange: $.extend(true, [], Store.luckysheet_select_save),
              format: format,
              conditionName: conditionName,
              conditionRange: conditionRange,
              conditionValue: conditionValue,
            }
          }

          $('#luckysheet-newConditionRule-dialog').hide()

          //新建规则的入口
          let source = $(this).attr('data-source')

          if (source == 0) {
            $('#luckysheet-modal-dialog-mask').hide()

            //保存之前的规则
            let fileH = $.extend(true, [], Store.luckysheetfile)
            let historyRules = _this.getHistoryRules(fileH)

            //保存当前的规则
            let ruleArr =
              Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
                'luckysheet_conditionformat_save'
              ] == undefined
                ? []
                : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
                    'luckysheet_conditionformat_save'
                  ]
            ruleArr.push(rule)
            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
              'luckysheet_conditionformat_save'
            ] = ruleArr

            let fileC = $.extend(true, [], Store.luckysheetfile)
            let currentRules = _this.getCurrentRules(fileC)

            //刷新一次表格
            _this.ref(historyRules, currentRules)

            //发送给后台
            if (server.allowUpdate) {
              server.saveParam('all', Store.currentSheetIndex, ruleArr, {
                k: 'luckysheet_conditionformat_save',
              })
            }
          } else if (source == 1) {
            //临时存储新规则
            let ruleArr = !!_this.fileClone[
              getSheetIndex(Store.currentSheetIndex)
            ]['luckysheet_conditionformat_save']
              ? _this.fileClone[getSheetIndex(Store.currentSheetIndex)][
                  'luckysheet_conditionformat_save'
                ]
              : []
            ruleArr.push(rule)
            _this.fileClone[getSheetIndex(Store.currentSheetIndex)][
              'luckysheet_conditionformat_save'
            ] = ruleArr

            //新建规则隐藏，管理规则显示
            _this.administerRuleDialog()
          }
        }
      )
    $(document)
      .off('click.CFnewConditionRuleClose')
      .on(
        'click.CFnewConditionRuleClose',
        '#luckysheet-newConditionRule-dialog-close',
        function() {
          //新建规则的入口
          let source = $(this).attr('data-source')
          if (source == 0) {
            $('#luckysheet-modal-dialog-mask').hide()
          }
          if (source == 1) {
            $('#luckysheet-administerRule-dialog').show()
          }

          //新建规则隐藏
          $('#luckysheet-newConditionRule-dialog').hide()

          //隐藏虚线框
          $('#luckysheet-formula-functionrange-select').hide()
          $('#luckysheet-row-count-show').hide()
          $('#luckysheet-column-count-show').hide()
        }
      )

    // 编辑规则
    $(document)
      .off('click.CFeditorConditionRule')
      .on('click.CFeditorConditionRule', '#editorConditionRule', function() {
        let sheetIndex = $(
          '#luckysheet-administerRule-dialog .chooseSheet option:selected'
        ).val()

        if (!checkProtectionFormatCells(sheetIndex)) {
          return
        }

        let itemIndex = $(
          '#luckysheet-administerRule-dialog .ruleList .listBox .item.on'
        ).attr('data-item')
        let rule = {
          sheetIndex: sheetIndex,
          itemIndex: itemIndex,
          data:
            _this.fileClone[getSheetIndex(sheetIndex)][
              'luckysheet_conditionformat_save'
            ][itemIndex],
        }
        _this.editorRule = rule
        _this.editorConditionRuleDialog()
      })
    $(document)
      .off('click.CFeditorConditionRuleConfirm')
      .on(
        'click.CFeditorConditionRuleConfirm',
        '#luckysheet-editorConditionRule-dialog-confirm',
        function() {
          let index = $(
            '#luckysheet-editorConditionRule-dialog .ruleTypeItem.on'
          ).index()
          let type1 = $(
            '#luckysheet-editorConditionRule-dialog #type1 option:selected'
          ).val()
          let type2 = $(
            '#luckysheet-editorConditionRule-dialog .' +
              type1 +
              'Box #type2 option:selected'
          ).val()

          let cellrange = _this.editorRule['data'].cellrange

          let format, rule
          if (index == 0) {
            if (type1 == 'dataBar') {
              //数据条
              let color = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find('.dataBarBox .luckysheet-conditionformat-config-color')
                .spectrum('get')
                .toHexString()

              if (type2 == 'gradient') {
                //渐变填充
                format = [color, '#ffffff']
              } else if (type2 == 'solid') {
                //实心填充
                format = [color]
              }

              rule = {
                type: 'dataBar',
                cellrange: cellrange,
                format: format,
              }
            } else if (type1 == 'colorGradation') {
              //色阶
              let maxcolor = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find(
                  '.colorGradationBox .maxVal .luckysheet-conditionformat-config-color'
                )
                .spectrum('get')
                .toRgbString()
              let midcolor = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find(
                  '.colorGradationBox .midVal .luckysheet-conditionformat-config-color'
                )
                .spectrum('get')
                .toRgbString()
              let mincolor = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find(
                  '.colorGradationBox .minVal .luckysheet-conditionformat-config-color'
                )
                .spectrum('get')
                .toRgbString()

              if (type2 == 'threeColor') {
                //三色
                format = [maxcolor, midcolor, mincolor]
              } else if (type2 == 'twoColor') {
                //双色
                format = [maxcolor, mincolor]
              }

              rule = {
                type: 'colorGradation',
                cellrange: cellrange,
                format: format,
              }
            } else if (type1 == 'icons') {
              //图标集
              let len = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find('.iconsBox .model')
                .attr('data-len')
              let leftMin = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find('.iconsBox .model')
                .attr('data-leftmin')
              let top = $(this)
                .parents('#luckysheet-editorConditionRule-dialog')
                .find('.iconsBox .model')
                .attr('data-top')

              format = {
                len: len,
                leftMin: leftMin,
                top: top,
              }

              rule = {
                type: 'icons',
                cellrange: cellrange,
                format: format,
              }
            }
          } else {
            let conditionName = '',
              conditionRange = [],
              conditionValue = []

            if (index == 1) {
              if (type1 == 'number') {
                //单元格值
                conditionName = type2

                if (type2 == 'betweenness') {
                  let v1 = $(
                    '#luckysheet-editorConditionRule-dialog #conditionVal input'
                  )
                    .val()
                    .trim()
                  let v2 = $(
                    '#luckysheet-editorConditionRule-dialog #conditionVal2 input'
                  )
                    .val()
                    .trim()

                  //条件值是否是选区
                  let rangeArr1 = _this.getRangeByTxt(v1)
                  if (rangeArr1.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  } else if (rangeArr1.length == 1) {
                    let r1 = rangeArr1[0].row[0],
                      r2 = rangeArr1[0].row[1]
                    let c1 = rangeArr1[0].column[0],
                      c2 = rangeArr1[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                      v1 = getcellvalue(r1, c1, Store.flowdata)

                      conditionRange.push({
                        row: rangeArr1[0].row,
                        column: rangeArr1[0].column,
                      })
                      conditionValue.push(v1)
                    } else {
                      _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                      return
                    }
                  } else if (rangeArr1.length == 0) {
                    if (isNaN(v1) || v1 == '') {
                      _this.infoDialog(
                        conditionformat_Text.conditionValueCanOnly,
                        ''
                      )
                      return
                    } else {
                      conditionValue.push(v1)
                    }
                  }

                  let rangeArr2 = _this.getRangeByTxt(v2)
                  if (rangeArr2.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  } else if (rangeArr2.length == 1) {
                    let r1 = rangeArr2[0].row[0],
                      r2 = rangeArr2[0].row[1]
                    let c1 = rangeArr2[0].column[0],
                      c2 = rangeArr2[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                      v2 = getcellvalue(r1, c1, Store.flowdata)

                      conditionRange.push({
                        row: rangeArr2[0].row,
                        column: rangeArr2[0].column,
                      })
                      conditionValue.push(v2)
                    } else {
                      _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                      return
                    }
                  } else if (rangeArr2.length == 0) {
                    if (isNaN(v2) || v2 == '') {
                      _this.infoDialog(
                        conditionformat_Text.conditionValueCanOnly,
                        ''
                      )
                      return
                    } else {
                      conditionValue.push(v2)
                    }
                  }
                } else {
                  //条件值
                  let v = $(
                    '#luckysheet-editorConditionRule-dialog #conditionVal input'
                  )
                    .val()
                    .trim()

                  //条件值是否是选区
                  let rangeArr = _this.getRangeByTxt(v)
                  if (rangeArr.length > 1) {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  } else if (rangeArr.length == 1) {
                    let r1 = rangeArr[0].row[0],
                      r2 = rangeArr[0].row[1]
                    let c1 = rangeArr[0].column[0],
                      c2 = rangeArr[0].column[1]

                    if (r1 == r2 && c1 == c2) {
                      v = getcellvalue(r1, c1, Store.flowdata)

                      conditionRange.push({
                        row: rangeArr[0].row,
                        column: rangeArr[0].column,
                      })
                      conditionValue.push(v)
                    } else {
                      _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                      return
                    }
                  } else if (rangeArr.length == 0) {
                    if (isNaN(v) || v == '') {
                      _this.infoDialog(
                        conditionformat_Text.conditionValueCanOnly,
                        ''
                      )
                      return
                    } else {
                      conditionValue.push(v)
                    }
                  }
                }
              } else if (type1 == 'text') {
                //特定文本
                conditionName = 'textContains'

                //条件值
                let v = $(
                  '#luckysheet-editorConditionRule-dialog #conditionVal input'
                )
                  .val()
                  .trim()

                //条件值是否是选区
                let rangeArr = _this.getRangeByTxt(v)
                if (rangeArr.length > 1) {
                  _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                  return
                } else if (rangeArr.length == 1) {
                  let r1 = rangeArr[0].row[0],
                    r2 = rangeArr[0].row[1]
                  let c1 = rangeArr[0].column[0],
                    c2 = rangeArr[0].column[1]

                  if (r1 == r2 && c1 == c2) {
                    v = getcellvalue(r1, c1, Store.flowdata)

                    conditionRange.push({
                      row: rangeArr[0].row,
                      column: rangeArr[0].column,
                    })
                    conditionValue.push(v)
                  } else {
                    _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                    return
                  }
                } else if (rangeArr.length == 0) {
                  if (isNaN(v) || v == '') {
                    _this.infoDialog(
                      conditionformat_Text.conditionValueCanOnly,
                      ''
                    )
                    return
                  } else {
                    conditionValue.push(v)
                  }
                }
              } else if (type1 == 'date') {
                //发生日期
                conditionName = 'occurrenceDate'

                //条件值
                let v = $(
                  '#luckysheet-editorConditionRule-dialog #daterange-btn'
                ).val()

                if (v == '' || v == null) {
                  _this.infoDialog(conditionformat_Text.pleaseSelectADate, '')
                  return
                }

                conditionValue.push(v)
              }
            } else if (index == 2) {
              //排名靠前靠后
              //条件名称
              if (type1 == 'top') {
                if (
                  $('#luckysheet-editorConditionRule-dialog #isPercent').is(
                    ':selected'
                  )
                ) {
                  conditionName = 'top10%'
                } else {
                  conditionName = 'top10'
                }
              } else if (type1 == 'last') {
                if (
                  $('#luckysheet-editorConditionRule-dialog #isPercent').is(
                    ':selected'
                  )
                ) {
                  conditionName = 'last10%'
                } else {
                  conditionName = 'last10'
                }
              }

              //条件值
              let v = $(
                '#luckysheet-editorConditionRule-dialog #conditionVal input'
              )
                .val()
                .trim()

              if (parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000) {
                _this.infoDialog(conditionformat_Text.pleaseEnterInteger, '')
                return
              }

              conditionValue.push(v)
            } else if (index == 3) {
              //平均值
              if (type1 == 'AboveAverage') {
                conditionName = 'AboveAverage'
                conditionValue.push('AboveAverage')
              } else if (type1 == 'SubAverage') {
                conditionName = 'SubAverage'
                conditionValue.push('SubAverage')
              }
            } else if (index == 4) {
              //重复值
              conditionName = 'duplicateValue'
              conditionValue.push(type1)
            } else if (index == 5) {
              //公式
              conditionName = 'formula'

              //条件值
              let v = $(
                '#luckysheet-editorConditionRule-dialog #formulaConditionVal input'
              )
                .val()
                .trim()
              if (v == '') {
                _this.infoDialog('Condition value cannot be empty!', '')
                return
              }

              conditionValue.push(v)
            }

            //格式颜色
            let textcolor
            if (
              $('#luckysheet-editorConditionRule-dialog #checkTextColor').is(
                ':checked'
              )
            ) {
              textcolor = $(
                '#luckysheet-editorConditionRule-dialog #textcolorshow'
              )
                .spectrum('get')
                .toHexString()
            } else {
              textcolor = null
            }

            let cellcolor
            if (
              $('#luckysheet-editorConditionRule-dialog #checkCellColor').is(
                ':checked'
              )
            ) {
              cellcolor = $(
                '#luckysheet-editorConditionRule-dialog #cellcolorshow'
              )
                .spectrum('get')
                .toHexString()
            } else {
              cellcolor = null
            }

            format = {
              textColor: textcolor,
              cellColor: cellcolor,
            }

            rule = {
              type: 'default',
              cellrange: cellrange,
              format: format,
              conditionName: conditionName,
              conditionRange: conditionRange,
              conditionValue: conditionValue,
            }
          }

          //修改编辑的规则
          let sheetIndex = _this.editorRule['sheetIndex']
          let itemIndex = _this.editorRule['itemIndex']
          _this.fileClone[getSheetIndex(sheetIndex)][
            'luckysheet_conditionformat_save'
          ][itemIndex] = rule

          //编辑规则隐藏，管理规则显示
          $('#luckysheet-editorConditionRule-dialog').hide()
          _this.administerRuleDialog()
        }
      )
    $(document)
      .off('click.CFeditorConditionRuleClose')
      .on(
        'click.CFeditorConditionRuleClose',
        '#luckysheet-editorConditionRule-dialog-close',
        function() {
          //编辑规则隐藏，管理规则显示
          $('#luckysheet-editorConditionRule-dialog').hide()
          $('#luckysheet-administerRule-dialog').show()
          //隐藏虚线框
          $('#luckysheet-formula-functionrange-select').hide()
          $('#luckysheet-row-count-show').hide()
          $('#luckysheet-column-count-show').hide()
        }
      )

    // 新建规则、编辑规则 类型切换
    $(document)
      .off('click.CFnewEditorRuleItem')
      .on(
        'click.CFnewEditorRuleItem',
        '.luckysheet-newEditorRule-dialog .ruleTypeItem',
        function() {
          $(this)
            .addClass('on')
            .siblings()
            .removeClass('on')

          let index = $(this).index()
          $(this)
            .parents('.luckysheet-newEditorRule-dialog')
            .find('.ruleExplainBox')
            .html(_this.getRuleExplain(index))

          _this.colorSelectInit()
        }
      )
    $(document)
      .off('change.CFnewEditorRuleType1')
      .on(
        'change.CFnewEditorRuleType1',
        '.luckysheet-newEditorRule-dialog #type1',
        function() {
          let optionVal = $(this)
            .find('option:selected')
            .val()

          if (
            optionVal == 'dataBar' ||
            optionVal == 'colorGradation' ||
            optionVal == 'icons' ||
            optionVal == 'number' ||
            optionVal == 'text' ||
            optionVal == 'date'
          ) {
            $(this)
              .parents('.luckysheet-newEditorRule-dialog')
              .find('.' + optionVal + 'Box')
              .show()
              .siblings()
              .hide()
          }

          if (optionVal == 'date') {
            _this.daterangeInit(
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .attr('id')
            )
          }
        }
      )
    $(document)
      .off('change.CFnewEditorRuleType2')
      .on(
        'change.CFnewEditorRuleType2',
        '.luckysheet-newEditorRule-dialog #type2',
        function() {
          let type1 = $(this)
            .parents('.luckysheet-newEditorRule-dialog')
            .find('#type1 option:selected')
            .val()

          if (type1 == 'colorGradation') {
            let type2 = $(this)
              .find('option:selected')
              .val()

            if (type2 == 'threeColor') {
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .find('.midVal')
                .show()
            } else {
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .find('.midVal')
                .hide()
            }
          } else if (type1 == 'number') {
            let type2 = $(this)
              .find('option:selected')
              .val()

            if (type2 == 'betweenness') {
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .find('.txt')
                .show()
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .find('#conditionVal2')
                .show()
            } else {
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .find('.txt')
                .hide()
              $(this)
                .parents('.luckysheet-newEditorRule-dialog')
                .find('#conditionVal2')
                .hide()
            }
          }
        }
      )
    $(document)
      .off('click.CFiconsShowbox')
      .on(
        'click.CFiconsShowbox',
        '.luckysheet-newEditorRule-dialog .iconsBox .showbox',
        function() {
          $(this)
            .parents('.iconsBox')
            .find('ul')
            .toggle()
        }
      )
    $(document)
      .off('click.CFiconsLi')
      .on(
        'click.CFiconsLi',
        '.luckysheet-newEditorRule-dialog .iconsBox li',
        function() {
          let len = $(this)
            .find('div')
            .attr('data-len')
          let leftmin = $(this)
            .find('div')
            .attr('data-leftmin')
          let top = $(this)
            .find('div')
            .attr('data-top')
          let title = $(this)
            .find('div')
            .attr('title')
          let position = $(this)
            .find('div')
            .css('background-position')

          $(this)
            .parents('.iconsBox')
            .find('.showbox .model')
            .css('background-position', position)
          $(this)
            .parents('.iconsBox')
            .find('.showbox .model')
            .attr('data-len', len)
          $(this)
            .parents('.iconsBox')
            .find('.showbox .model')
            .attr('data-leftmin', leftmin)
          $(this)
            .parents('.iconsBox')
            .find('.showbox .model')
            .attr('data-top', top)
          $(this)
            .parents('.iconsBox')
            .find('.showbox .model')
            .attr('title', title)

          $(this)
            .parents('ul')
            .hide()
        }
      )

    // 删除规则
    $(document)
      .off('click.CFdeleteConditionRule')
      .on('click.CFdeleteConditionRule', '#deleteConditionRule', function() {
        let sheetIndex = $(
          '#luckysheet-administerRule-dialog .chooseSheet option:selected'
        ).val()

        if (!checkProtectionFormatCells(sheetIndex)) {
          return
        }

        let itemIndex = $(
          '#luckysheet-administerRule-dialog .ruleList .listBox .item.on'
        ).attr('data-item')
        _this.fileClone[getSheetIndex(sheetIndex)][
          'luckysheet_conditionformat_save'
        ].splice(itemIndex, 1)
        _this.administerRuleDialog()
      })

    // 规则子菜单弹出层 点击确定修改样式
    $(document)
      .off('click.CFdefault')
      .on(
        'click.CFdefault',
        '#luckysheet-conditionformat-dialog-confirm',
        function() {
          if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
            return
          }

          //条件名称
          let conditionName = $('#luckysheet-conditionformat-dialog .box').attr(
            'data-itemvalue'
          )

          //条件单元格
          let conditionRange = []

          //条件值
          let conditionValue = []
          if (
            conditionName == 'greaterThan' ||
            conditionName == 'lessThan' ||
            conditionName == 'equal' ||
            conditionName == 'textContains'
          ) {
            let v = $('#luckysheet-conditionformat-dialog #conditionVal')
              .val()
              .trim()

            //条件值是否是选区
            let rangeArr = _this.getRangeByTxt(v)
            if (rangeArr.length > 1) {
              _this.infoDialog(conditionformat_Text.onlySingleCell, '')
              return
            } else if (rangeArr.length == 1) {
              let r1 = rangeArr[0].row[0],
                r2 = rangeArr[0].row[1]
              let c1 = rangeArr[0].column[0],
                c2 = rangeArr[0].column[1]

              if (r1 == r2 && c1 == c2) {
                v = getcellvalue(r1, c1, Store.flowdata)

                conditionRange.push({
                  row: rangeArr[0].row,
                  column: rangeArr[0].column,
                })
                conditionValue.push(v)
              } else {
                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                return
              }
            } else if (rangeArr.length == 0) {
              if (isNaN(v) || v == '') {
                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                return
              } else {
                conditionValue.push(v)
              }
            }
          } else if (conditionName == 'betweenness') {
            //介于
            let v1 = $('#luckysheet-conditionformat-dialog #conditionVal')
              .val()
              .trim()
            let v2 = $('#luckysheet-conditionformat-dialog #conditionVal2')
              .val()
              .trim()

            //条件值是否是选区
            let rangeArr1 = _this.getRangeByTxt(v1)
            if (rangeArr1.length > 1) {
              _this.infoDialog(conditionformat_Text.onlySingleCell, '')
              return
            } else if (rangeArr1.length == 1) {
              let r1 = rangeArr1[0].row[0],
                r2 = rangeArr1[0].row[1]
              let c1 = rangeArr1[0].column[0],
                c2 = rangeArr1[0].column[1]

              if (r1 == r2 && c1 == c2) {
                v1 = getcellvalue(r1, c1, Store.flowdata)

                conditionRange.push({
                  row: rangeArr1[0].row,
                  column: rangeArr1[0].column,
                })
                conditionValue.push(v1)
              } else {
                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                return
              }
            } else if (rangeArr1.length == 0) {
              if (isNaN(v1) || v1 == '') {
                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                return
              } else {
                conditionValue.push(v1)
              }
            }

            let rangeArr2 = _this.getRangeByTxt(v2)
            if (rangeArr2.length > 1) {
              _this.infoDialog(conditionformat_Text.onlySingleCell, '')
              return
            } else if (rangeArr2.length == 1) {
              let r1 = rangeArr2[0].row[0],
                r2 = rangeArr2[0].row[1]
              let c1 = rangeArr2[0].column[0],
                c2 = rangeArr2[0].column[1]

              if (r1 == r2 && c1 == c2) {
                v2 = getcellvalue(r1, c1, Store.flowdata)

                conditionRange.push({
                  row: rangeArr2[0].row,
                  column: rangeArr2[0].column,
                })
                conditionValue.push(v2)
              } else {
                _this.infoDialog(conditionformat_Text.onlySingleCell, '')
                return
              }
            } else if (rangeArr2.length == 0) {
              if (isNaN(v2) || v2 == '') {
                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, '')
                return
              } else {
                conditionValue.push(v2)
              }
            }
          } else if (conditionName == 'occurrenceDate') {
            //日期
            let v = $('#luckysheet-conditionformat-dialog #daterange-btn').val()

            if (v == '' || v == null) {
              _this.infoDialog(conditionformat_Text.pleaseSelectADate, '')
              return
            }

            conditionValue.push(v)
          } else if (conditionName == 'duplicateValue') {
            //重复值
            conditionValue.push(
              $(
                '#luckysheet-conditionformat-dialog #conditionVal option:selected'
              ).val()
            )
          } else if (
            conditionName == 'top10' ||
            conditionName == 'top10%' ||
            conditionName == 'last10' ||
            conditionName == 'last10%'
          ) {
            let v = $('#luckysheet-conditionformat-dialog #conditionVal')
              .val()
              .trim()

            if (parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000) {
              _this.infoDialog(conditionformat_Text.pleaseEnterInteger, '')
              return
            }

            conditionValue.push(v)
          } else if (conditionName == 'AboveAverage') {
            //高于平均值
            conditionValue.push('AboveAverage')
          } else if (conditionName == 'SubAverage') {
            //低于平均值
            conditionValue.push('SubAverage')
          }

          //格式颜色
          let textcolor
          if ($('#checkTextColor').is(':checked')) {
            textcolor = $('#textcolorshow')
              .spectrum('get')
              .toHexString()
          } else {
            textcolor = null
          }

          let cellcolor
          if ($('#checkCellColor').is(':checked')) {
            cellcolor = $('#cellcolorshow')
              .spectrum('get')
              .toHexString()
          } else {
            cellcolor = null
          }

          //保存之前的规则
          let fileH = $.extend(true, [], Store.luckysheetfile)
          let historyRules = _this.getHistoryRules(fileH)

          //保存当前的规则
          let rule = {
            type: 'default',
            cellrange: $.extend(true, [], Store.luckysheet_select_save),
            format: {
              textColor: textcolor,
              cellColor: cellcolor,
            },
            conditionName: conditionName,
            conditionRange: conditionRange,
            conditionValue: conditionValue,
          }
          let ruleArr =
            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
              'luckysheet_conditionformat_save'
            ] == undefined
              ? []
              : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
                  'luckysheet_conditionformat_save'
                ]
          ruleArr.push(rule)
          Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
            'luckysheet_conditionformat_save'
          ] = ruleArr

          let fileC = $.extend(true, [], Store.luckysheetfile)
          let currentRules = _this.getCurrentRules(fileC)

          //刷新一次表格
          _this.ref(historyRules, currentRules)

          //隐藏一些dom
          $('#luckysheet-modal-dialog-mask').hide()
          $('#luckysheet-conditionformat-dialog').hide()

          //发送给后台
          if (server.allowUpdate) {
            server.saveParam('all', Store.currentSheetIndex, ruleArr, {
              k: 'luckysheet_conditionformat_save',
            })
          }
        }
      )

    // 图标集弹出层 选择
    $(document)
      .off('click.CFicons')
      .on('click.CFicons', '#luckysheet-CFicons-dialog .item', function() {
        $('#luckysheet-modal-dialog-mask').hide()
        $('#luckysheet-CFicons-dialog').hide()

        if (Store.luckysheet_select_save.length > 0) {
          let cellrange = $.extend(true, [], Store.luckysheet_select_save)
          let format = {
            len: $(this).attr('data-len'),
            leftMin: $(this).attr('data-leftMin'),
            top: $(this).attr('data-top'),
          }

          _this.updateItem('icons', cellrange, format)
        }
      })

    // 选择单元格
    $(document).on('click', '.range .fa-table', function() {
      let id = $(this)
        .parents('.luckysheet-modal-dialog')
        .attr('id')
      $('#' + id).hide()
      //入口
      let source

      if (id == 'luckysheet-conditionformat-dialog') {
        let $id = $(this)
          .siblings('input')
          .attr('id')

        if ($id == 'conditionVal') {
          source = '0_1'
        } else {
          source = '0_2'
        }
      } else if (id == 'luckysheet-newConditionRule-dialog') {
        let $id = $(this)
          .parents('.range')
          .attr('id')

        if ($id == 'formulaConditionVal') {
          source = '1_0'
        } else if ($id == 'conditionVal') {
          source = '1_1'
        } else {
          source = '1_2'
        }
      } else if (id == 'luckysheet-editorConditionRule-dialog') {
        let $id = $(this)
          .parents('.range')
          .attr('id')

        if ($id == 'formulaConditionVal') {
          source = '2_0'
        } else if ($id == 'conditionVal') {
          source = '2_1'
        } else {
          source = '2_2'
        }
      }
      //input值
      let v = $(this)
        .siblings('input')
        .val()

      _this.singleRangeDialog(source, v)
      selectionCopyShow(_this.getRangeByTxt(v))
    })
    $(document).on(
      'click',
      '#luckysheet-singleRange-dialog-confirm',
      function() {
        $('#luckysheet-modal-dialog-mask').show()
        $(this)
          .parents('#luckysheet-singleRange-dialog')
          .hide()

        let source = $(this).attr('data-source')
        let v = $(this)
          .parents('#luckysheet-singleRange-dialog')
          .find('input')
          .val()

        if (source == '0_1') {
          $('#luckysheet-conditionformat-dialog').show()
          $('#luckysheet-conditionformat-dialog #conditionVal').val(v)
        } else if (source == '0_2') {
          $('#luckysheet-conditionformat-dialog').show()
          $('#luckysheet-conditionformat-dialog #conditionVal2').val(v)
        } else if (source == '1_0') {
          $('#luckysheet-newConditionRule-dialog').show()
          $(
            '#luckysheet-newConditionRule-dialog #formulaConditionVal input'
          ).val(v)
        } else if (source == '1_1') {
          $('#luckysheet-newConditionRule-dialog').show()
          $('#luckysheet-newConditionRule-dialog #conditionVal input').val(v)
        } else if (source == '1_2') {
          $('#luckysheet-newConditionRule-dialog').show()
          $('#luckysheet-newConditionRule-dialog #conditionVal2 input').val(v)
        } else if (source == '2_0') {
          $('#luckysheet-editorConditionRule-dialog').show()
          $(
            '#luckysheet-editorConditionRule-dialog #formulaConditionVal input'
          ).val(v)
        } else if (source == '2_1') {
          $('#luckysheet-editorConditionRule-dialog').show()
          $('#luckysheet-editorConditionRule-dialog #conditionVal input').val(v)
        } else if (source == '2_2') {
          $('#luckysheet-editorConditionRule-dialog').show()
          $('#luckysheet-editorConditionRule-dialog #conditionVal2 input').val(
            v
          )
        }

        let range = []
        selectionCopyShow(range)
      }
    )
    $(document).on('click', '#luckysheet-singleRange-dialog-close', function() {
      $('#luckysheet-modal-dialog-mask').show()
      $(this)
        .parents('#luckysheet-singleRange-dialog')
        .hide()

      let source = $(this).attr('data-source')
      if (source == '0_1' || source == '0_2') {
        $('#luckysheet-conditionformat-dialog').show()
      } else if (source == '1_0' || source == '1_1' || source == '1_2') {
        $('#luckysheet-newConditionRule-dialog').show()
      } else if (source == '2_0' || source == '2_1' || source == '2_2') {
        $('#luckysheet-editorConditionRule-dialog').show()
      }

      let range = []
      selectionCopyShow(range)
    })

    // 弹出层右上角关闭按钮
    $(document).on('click', '.luckysheet-modal-dialog-title-close', function() {
      let id = $(this)
        .parents('.luckysheet-modal-dialog')
        .attr('id')

      //新建规则弹出层
      if (id == 'luckysheet-newConditionRule-dialog') {
        let source = $('#' + id)
          .find('#luckysheet-newConditionRule-dialog-close')
          .attr('data-source')
        //新建规则入口
        if (source == 1) {
          $('#luckysheet-administerRule-dialog').show()
        }
      }

      //编辑规则弹出层
      if (id == 'luckysheet-editorConditionRule-dialog') {
        $('#luckysheet-administerRule-dialog').show()
      }

      //选择单元格弹出层
      if (id == 'luckysheet-singleRange-dialog') {
        $('#luckysheet-modal-dialog-mask').show()

        let source = $(this)
          .parents('#luckysheet-singleRange-dialog')
          .find('#luckysheet-singleRange-dialog-confirm')
          .attr('data-source')
        if (source == '0_1' || source == '0_2') {
          $('#luckysheet-conditionformat-dialog').show()
        } else if (source == '1_1' || source == '1_2') {
          $('#luckysheet-newConditionRule-dialog').show()
        } else if (source == '2_1' || source == '2_2') {
          $('#luckysheet-editorConditionRule-dialog').show()
        }

        let range = []
        selectionCopyShow(range)
      }

      //选择应用范围弹出层
      if (id == 'luckysheet-multiRange-dialog') {
        $('#luckysheet-modal-dialog-mask').show()

        $('#luckysheet-administerRule-dialog').show()

        let range = []
        selectionCopyShow(range)
      }

      //提示框
      if (id == 'luckysheet-conditionformat-info-dialog') {
        $('#luckysheet-modal-dialog-mask').show()
      }
    })

    //提示框
    $(document).on(
      'click',
      '#luckysheet-conditionformat-info-dialog-close',
      function() {
        $(this)
          .parents('#luckysheet-conditionformat-info-dialog')
          .hide()
      }
    )
  },
  singleRangeDialog: function(source, value) {
    $('#luckysheet-modal-dialog-mask').hide()
    $('#luckysheet-singleRange-dialog').remove()

    const conditionformat_Text = locale().conditionformat

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-singleRange-dialog',
          addclass: 'luckysheet-singleRange-dialog',
          title: conditionformat_Text.selectCell,
          content: `<input readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectCell}" value="${value}"/>`,
          botton: `<button id="luckysheet-singleRange-dialog-confirm" class="btn btn-primary" data-source="${source}">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-singleRange-dialog-close" class="btn btn-default" data-source="${source}">${conditionformat_Text.cancel}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-singleRange-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 300)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-singleRange-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()
  },
  multiRangeDialog: function(dataItem, value) {
    let _this = this

    $('#luckysheet-modal-dialog-mask').hide()
    $('#luckysheet-multiRange-dialog').remove()

    const conditionformat_Text = locale().conditionformat

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-multiRange-dialog',
          addclass: 'luckysheet-multiRange-dialog',
          title: conditionformat_Text.selectRange,
          content: `<input readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectRange}" value="${value}"/>`,
          botton: `<button id="luckysheet-multiRange-dialog-confirm" class="btn btn-primary" data-item="${dataItem}">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-multiRange-dialog-close" class="btn btn-default">${conditionformat_Text.cancel}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-multiRange-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 300)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-multiRange-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()

    selectionCopyShow(_this.getRangeByTxt(value))
  },
  getTxtByRange: function(range) {
    if (range.length > 0) {
      let txt = []

      for (let s = 0; s < range.length; s++) {
        let r1 = range[s].row[0],
          r2 = range[s].row[1]
        let c1 = range[s].column[0],
          c2 = range[s].column[1]

        txt.push(
          getRangetxt(
            Store.currentSheetIndex,
            { row: [r1, r2], column: [c1, c2] },
            Store.currentSheetIndex
          )
        )
      }

      return txt.join(',')
    }
  },
  getRangeByTxt: function(txt) {
    let range = []

    txt = txt.toString()

    if (txt.indexOf(',') != -1) {
      let arr = txt.split(',')
      for (let i = 0; i < arr.length; i++) {
        if (formula.iscelldata(arr[i])) {
          range.push(formula.getcellrange(arr[i]))
        } else {
          range = []
          break
        }
      }
    } else {
      if (formula.iscelldata(txt)) {
        range.push(formula.getcellrange(txt))
      }
    }
    return range
  },
  colorSelectInit: function() {
    const conditionformat_Text = locale().conditionformat

    $('.luckysheet-conditionformat-config-color').spectrum({
      showPalette: true,
      showPaletteOnly: true,
      preferredFormat: 'hex',
      clickoutFiresChange: false,
      showInitial: true,
      showInput: true,
      // flat: true,
      hideAfterPaletteSelect: true,
      showSelectionPalette: true,
      // showButtons: false,//隐藏选择取消按钮
      maxPaletteSize: 8,
      maxSelectionSize: 8,
      // color: currenColor,
      cancelText: conditionformat_Text.cancel,
      chooseText: conditionformat_Text.confirmColor,
      togglePaletteMoreText: '自定义',
      togglePaletteLessText: '收起',
      togglePaletteOnly: true,
      clearText: conditionformat_Text.clearColorSelect,
      noColorSelectedText: '没有颜色被选择',
      localStorageKey: 'spectrum.textcolor' + server.gridKey,
      palette: [
        ['#000', '#444', '#666', '#999', '#ccc', '#eee', '#f3f3f3', '#fff'],
        ['#f00', '#f90', '#ff0', '#0f0', '#0ff', '#00f', '#90f', '#f0f'],
        [
          '#f4cccc',
          '#fce5cd',
          '#fff2cc',
          '#d9ead3',
          '#d0e0e3',
          '#cfe2f3',
          '#d9d2e9',
          '#ead1dc',
        ],
        [
          '#ea9999',
          '#f9cb9c',
          '#ffe599',
          '#b6d7a8',
          '#a2c4c9',
          '#9fc5e8',
          '#b4a7d6',
          '#d5a6bd',
        ],
        [
          '#e06666',
          '#f6b26b',
          '#ffd966',
          '#93c47d',
          '#76a5af',
          '#6fa8dc',
          '#8e7cc3',
          '#c27ba0',
        ],
        [
          '#c00',
          '#e69138',
          '#f1c232',
          '#6aa84f',
          '#45818e',
          '#3d85c6',
          '#674ea7',
          '#a64d79',
        ],
        [
          '#900',
          '#b45f06',
          '#bf9000',
          '#38761d',
          '#134f5c',
          '#0b5394',
          '#351c75',
          '#741b47',
        ],
        [
          '#600',
          '#783f04',
          '#7f6000',
          '#274e13',
          '#0c343d',
          '#073763',
          '#20124d',
          '#4c1130',
        ],
      ],
      change: function(color) {
        if (color != null) {
          color = color.toHexString()
        }
      },
    })
  },
  conditionformatDialog: function(title, content) {
    let _this = this

    $('#luckysheet-modal-dialog-mask').show()
    $('#luckysheet-conditionformat-dialog').remove()

    const conditionformat_Text = locale().conditionformat

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-conditionformat-dialog',
          addclass: 'luckysheet-conditionformat-dialog',
          title: title,
          content: content,
          botton: `<button id="luckysheet-conditionformat-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button>
                        <button class="btn btn-default luckysheet-model-close-btn">${conditionformat_Text.cancel}</button>`,
          style: 'z-index:9999',
        })
      )
    let $t = $('#luckysheet-conditionformat-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 300)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-conditionformat-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()

    _this.init()
    _this.colorSelectInit()

    if (title == locale().conditionformat.conditionformat_occurrenceDate) {
      _this.daterangeInit('luckysheet-conditionformat-dialog')
    }
  },
  CFiconsDialog: function() {
    $('#luckysheet-modal-dialog-mask').show()
    $('#luckysheet-CFicons-dialog').remove()

    const conditionformat_Text = locale().conditionformat

    let content = `<div class="box">
                            <div style="margin-bottom: 10px;">${conditionformat_Text.pleaseSelectIcon}</div>
                            <div class="title">${conditionformat_Text.direction}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 0;"></div></div>
                                    <div class="item" data-len="3" data-leftMin="0" data-top="1" title="${conditionformat_Text.threeTriangles}"><div style="background-position:0 -20px;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="0" data-top="2" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 -40px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="0" data-top="3" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 -60px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="3" data-leftMin="5" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px 0;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="5" data-top="1" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px -20px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="5" data-top="2" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px -40px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                            <div class="title">${conditionformat_Text.shape}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})"><div style="background-position:0 -80px;"></div></div>
                                    <div class="item" data-len="3" data-leftMin="0" data-top="5" title="${conditionformat_Text.threeSigns}"><div style="background-position:0 -100px;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="0" data-top="6" title="${conditionformat_Text.greenRedBlackGradient}"><div style="background-position:0 -120px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="3" data-leftMin="5" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})"><div style="background-position:-131px -80px;"></div></div>
                                    <div class="item" data-len="4" data-leftMin="5" data-top="5" title="${conditionformat_Text.fourColorTrafficLight}"><div style="background-position:-131px -100px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                            <div class="title">${conditionformat_Text.mark}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})"><div style="background-position:0 -140px;"></div></div>
                                    <div class="item" data-len="3" data-leftMin="0" data-top="8" title="${conditionformat_Text.tricolorFlag}"><div style="background-position:0 -160px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="3" data-leftMin="5" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})"><div style="background-position:-131px -140px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                            <div class="title">${conditionformat_Text.grade}</div>
                            <div class="list">
                                <div class="left">
                                    <div class="item" data-len="3" data-leftMin="0" data-top="9" title="${conditionformat_Text.threeStars}"><div style="background-position:0 -180px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="0" data-top="10" title="${conditionformat_Text.fiveQuadrantDiagram}"><div style="background-position:0 -200px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="0" data-top="11" title="${conditionformat_Text.fiveBoxes}"><div style="background-position:0 -220px;"></div></div>
                                </div>
                                <div class="right">
                                    <div class="item" data-len="4" data-leftMin="5" data-top="9" title="${conditionformat_Text.grade4}"><div style="background-position:-131px -180px;"></div></div>
                                    <div class="item" data-len="5" data-leftMin="5" data-top="10" title="${conditionformat_Text.grade5}"><div style="background-position:-131px -200px;"></div></div>
                                </div>
                                <div style="clear:both;"></div>
                            </div>
                        </div>`

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-CFicons-dialog',
          addclass: 'luckysheet-CFicons-dialog',
          title: conditionformat_Text.icons,
          content: content,
          botton: `<button class="btn btn-default luckysheet-model-close-btn">${conditionformat_Text.close}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-CFicons-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 400)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-CFicons-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()
  },
  administerRuleDialog: function() {
    $('#luckysheet-modal-dialog-mask').show()
    $('#luckysheet-administerRule-dialog').remove()

    const conditionformat_Text = locale().conditionformat

    //工作表
    let opHtml = ''
    for (let j = 0; j < Store.luckysheetfile.length; j++) {
      if (Store.luckysheetfile[j].status == '1') {
        opHtml += `<option value="${Store.luckysheetfile[j]['index']}" selected="selected">
                                ${conditionformat_Text.currentSheet}：${Store.luckysheetfile[j]['name']}
                            </option>`
      } else {
        opHtml += `<option value="${Store.luckysheetfile[j]['index']}">
                                ${conditionformat_Text.sheet}：${Store.luckysheetfile[j]['name']}
                            </option>`
      }
    }

    let content = `<div class="chooseSheet">
                            <label>${conditionformat_Text.showRules}：</label>
                            <select>${opHtml}</select>
                        </div>
                        <div class="ruleBox">
                            <div class="ruleBtn">
                                <button id="newConditionRule" class="btn btn-default">${conditionformat_Text.newRule}</button>
                                <button id="editorConditionRule" class="btn btn-default">${conditionformat_Text.editRule}</button>
                                <button id="deleteConditionRule" class="btn btn-default">${conditionformat_Text.deleteRule}</button>
                            </div>
                            <div class="ruleList">
                                <div class="listTitle">
                                    <span>${conditionformat_Text.rule}</span>
                                    <span>${conditionformat_Text.format}</span>
                                    <span>${conditionformat_Text.applyRange}</span>
                                </div>
                                <div class="listBox"></div>
                            </div>
                        </div>`

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-administerRule-dialog',
          addclass: 'luckysheet-administerRule-dialog',
          title: conditionformat_Text.conditionformatManageRules,
          content: content,
          botton: `<button id="luckysheet-administerRule-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-administerRule-dialog-close" class="btn btn-default">${conditionformat_Text.close}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-administerRule-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 400)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-administerRule-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()

    //当前工作表的规则列表
    let index = $(
      '#luckysheet-administerRule-dialog .chooseSheet option:selected'
    ).val()
    this.getConditionRuleList(index)
  },
  getConditionRuleList: function(index) {
    let _this = this

    $('#luckysheet-administerRule-dialog .ruleList .listBox').empty()

    let ruleArr =
      _this.fileClone[getSheetIndex(index)].luckysheet_conditionformat_save //条件格式规则集合
    if (ruleArr != null && ruleArr.length > 0) {
      const conditionformat_Text = locale().conditionformat
      const l = ruleArr.length
      for (let i = 0; i < l; i++) {
        let type = ruleArr[i]['type'] //规则类型
        let format = ruleArr[i]['format'] //规则样式
        let cellrange = ruleArr[i]['cellrange'] //规则应用范围

        let ruleName //规则名称
        let formatHtml = '' //样式dom
        if (type == 'dataBar') {
          ruleName = conditionformat_Text.dataBar

          formatHtml =
            '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'
        } else if (type == 'colorGradation') {
          ruleName = conditionformat_Text.colorGradation

          formatHtml =
            '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'
        } else if (type == 'icons') {
          ruleName = conditionformat_Text.icons

          formatHtml =
            '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'
        } else {
          ruleName = _this.getConditionRuleName(
            ruleArr[i].conditionName,
            ruleArr[i].conditionRange,
            ruleArr[i].conditionValue
          )

          if (format['textColor'] != null) {
            formatHtml +=
              '<span class="colorbox" title="' +
              conditionformat_Text.textColor +
              '" style="background-color:' +
              format['textColor'] +
              '"></span>'
          }

          if (format['cellColor'] != null) {
            formatHtml +=
              '<span class="colorbox" title="' +
              conditionformat_Text.cellColor +
              '" style="background-color:' +
              format['cellColor'] +
              '"></span>'
          }
        }

        //应用范围dom
        let rangeTxtArr = []
        for (let s = 0; s < cellrange.length; s++) {
          let r1 = cellrange[s].row[0],
            r2 = cellrange[s].row[1]
          let c1 = cellrange[s].column[0],
            c2 = cellrange[s].column[1]

          rangeTxtArr.push(
            chatatABC(c1) + (r1 + 1) + ':' + chatatABC(c2) + (r2 + 1)
          )
        }

        //条件格式规则列表dom
        let itemHtml =
          '<div class="item" data-item="' +
          i +
          '">' +
          '<div class="ruleName" title="' +
          ruleName +
          '">' +
          ruleName +
          '</div>' +
          '<div class="format">' +
          formatHtml +
          '</div>' +
          '<div class="ruleRange">' +
          '<input class="formulaInputFocus" readonly="true" value="' +
          rangeTxtArr.join(',') +
          '"/>' +
          '<i class="fa fa-table" aria-hidden="true" title="' +
          conditionformat_Text.selectRange +
          '"></i>' +
          '</div>' +
          '</div>'

        $('#luckysheet-administerRule-dialog .ruleList .listBox').prepend(
          itemHtml
        )
      }

      $(
        '#luckysheet-administerRule-dialog .ruleList .listBox .item canvas'
      ).each(function(i) {
        let x = $(this)
          .closest('.item')
          .attr('data-item')

        let type = ruleArr[x]['type']
        let format = ruleArr[x]['format']

        let can = $(this)
          .get(0)
          .getContext('2d')
        if (type == 'dataBar') {
          if (format.length == 2) {
            let my_gradient = can.createLinearGradient(0, 0, 46, 0)
            my_gradient.addColorStop(0, format[0])
            my_gradient.addColorStop(1, format[1])
            can.fillStyle = my_gradient
            can.fillRect(0, 0, 46, 18)

            can.beginPath()
            can.moveTo(0, 0)
            can.lineTo(0, 18)
            can.lineTo(46, 18)
            can.lineTo(46, 0)
            can.lineTo(0, 0)
            can.lineWidth = Store.devicePixelRatio
            can.strokeStyle = format[0]
            can.stroke()
            can.closePath()
          } else if (format.length == 1) {
            can.fillStyle = format[0]
            can.fillRect(0, 0, 46, 18)

            can.beginPath()
            can.moveTo(0, 0)
            can.lineTo(0, 18)
            can.lineTo(46, 18)
            can.lineTo(46, 0)
            can.lineTo(0, 0)
            can.lineWidth = Store.devicePixelRatio
            can.strokeStyle = format[0]
            can.stroke()
            can.closePath()
          }
        } else if (type == 'colorGradation') {
          let my_gradient = can.createLinearGradient(0, 0, 46, 0)

          if (format.length == 3) {
            my_gradient.addColorStop(0, format[0])
            my_gradient.addColorStop(0.5, format[1])
            my_gradient.addColorStop(1, format[2])
          } else if (format.length == 2) {
            my_gradient.addColorStop(0, format[0])
            my_gradient.addColorStop(1, format[1])
          }

          can.fillStyle = my_gradient
          can.fillRect(0, 0, 46, 18)
        } else if (type == 'icons') {
          let len = format['len']
          let l = format['leftMin']
          let t = format['top']

          let w1 = 32 * len + 10 * (len - 1)
          let h1 = 32
          let w2 = 46
          let h2 = (46 * 32) / w1

          if (l == '0') {
            can.drawImage(
              luckysheet_CFiconsImg,
              0,
              t * 32,
              w1,
              h1,
              0,
              (18 - h2) / 2,
              w2,
              h2
            )
          } else if (l == '5') {
            can.drawImage(
              luckysheet_CFiconsImg,
              210,
              t * 32,
              w1,
              h1,
              0,
              (18 - h2) / 2,
              w2,
              h2
            )
          }
        }
      })

      $('#luckysheet-administerRule-dialog .ruleList .listBox .item')
        .eq(0)
        .addClass('on')
    }
  },
  getConditionRuleName: function(
    conditionName,
    conditionRange,
    conditionValue
  ) {
    //v 有条件单元格取条件单元格，若无取条件值
    let v
    if (conditionRange[0] != null) {
      v =
        chatatABC(conditionRange[0]['column'][0]) +
        (conditionRange[0]['row'][0] + 1)
    } else {
      v = conditionValue[0]
    }

    const conditionformat_Text = locale().conditionformat

    //返回条件格式规则名称
    if (conditionName == 'greaterThan') {
      return conditionformat_Text.cellValue + ' > ' + v
    } else if (conditionName == 'lessThan') {
      return conditionformat_Text.cellValue + ' < ' + v
    } else if (conditionName == 'betweenness') {
      let v2
      if (conditionRange[1] != null) {
        v2 =
          chatatABC(conditionRange[1]['column'][0]) +
          (conditionRange[1]['row'][0] + 1)
      } else {
        v2 = conditionValue[1]
      }
      return (
        conditionformat_Text.cellValue +
        ' ' +
        conditionformat_Text.between +
        ' ' +
        v +
        ' ' +
        conditionformat_Text.in +
        ' ' +
        v2 +
        ' ' +
        conditionformat_Text.between2
      )
    } else if (conditionName == 'equal') {
      return conditionformat_Text.cellValue + ' = ' + v
    } else if (conditionName == 'textContains') {
      return (
        conditionformat_Text.cellValue + conditionformat_Text.contain + ' =' + v
      )
    } else if (conditionName == 'occurrenceDate') {
      return conditionValue
    } else if (conditionName == 'duplicateValue') {
      if (conditionValue == '0') {
        return conditionformat_Text.duplicateValue
      }
      if (conditionValue == '1') {
        return conditionformat_Text.uniqueValue
      }
    } else if (conditionName == 'top10') {
      return (
        conditionformat_Text.top + ' ' + v + ' ' + conditionformat_Text.oneself
      )
    } else if (conditionName == 'top10%') {
      return (
        conditionformat_Text.top + ' ' + v + '% ' + conditionformat_Text.oneself
      )
    } else if (conditionName == 'last10') {
      return (
        conditionformat_Text.last + ' ' + v + ' ' + conditionformat_Text.oneself
      )
    } else if (conditionName == 'last10%') {
      return (
        conditionformat_Text.last +
        ' ' +
        v +
        '% ' +
        conditionformat_Text.oneself
      )
    } else if (conditionName == 'AboveAverage') {
      return conditionformat_Text.aboveAverage
    } else if (conditionName == 'SubAverage') {
      return conditionformat_Text.belowAverage
    } else if (conditionName == 'formula') {
      if (v.slice(0, 1) != '=') {
        v = '=' + v
      }

      return conditionformat_Text.formula + ': ' + v
    }
  },
  newConditionRuleDialog: function(source) {
    let _this = this

    const conditionformat_Text = locale().conditionformat

    //规则说明
    let ruleExplainHtml = _this.getRuleExplain(0)

    //弹出层
    $('#luckysheet-modal-dialog-mask').show()
    $('#luckysheet-administerRule-dialog').hide()
    $('#luckysheet-newConditionRule-dialog').remove()

    let content =
      '<div>' +
      '<div class="boxTitle">' +
      conditionformat_Text.chooseRuleType +
      '：</div>' +
      _this.ruleTypeHtml() +
      '<div class="boxTitle">' +
      conditionformat_Text.editRuleDescription +
      '：</div>' +
      '<div class="ruleExplainBox">' +
      ruleExplainHtml +
      '</div>' +
      '</div>'

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-newConditionRule-dialog',
          addclass: 'luckysheet-newEditorRule-dialog',
          title: conditionformat_Text.newFormatRule,
          content: content,
          botton: `<button id="luckysheet-newConditionRule-dialog-confirm" class="btn btn-primary" data-source="${source}">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-newConditionRule-dialog-close" class="btn btn-default" data-source="${source}">${conditionformat_Text.cancel}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-newConditionRule-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 400)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-newConditionRule-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()

    //index的规则类型focus
    $('#luckysheet-newConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(0)')
      .addClass('on')
      .siblings()
      .removeClass('on')

    _this.colorSelectInit()
  },
  editorConditionRuleDialog: function() {
    let _this = this

    const conditionformat_Text = locale().conditionformat

    let rule = _this.editorRule.data

    if (rule == null) {
      return
    }

    let ruleType = rule['type'],
      ruleFormat = rule['format'],
      conditionName = rule['conditionName']

    let index, type1
    if (
      ruleType == 'dataBar' ||
      ruleType == 'colorGradation' ||
      ruleType == 'icons'
    ) {
      index = 0
      type1 = ruleType
    } else {
      if (
        conditionName == 'greaterThan' ||
        conditionName == 'lessThan' ||
        conditionName == 'betweenness' ||
        conditionName == 'equal' ||
        conditionName == 'textContains' ||
        conditionName == 'occurrenceDate'
      ) {
        index = 1

        if (
          conditionName == 'greaterThan' ||
          conditionName == 'lessThan' ||
          conditionName == 'betweenness' ||
          conditionName == 'equal'
        ) {
          type1 = 'number'
        } else if (conditionName == 'textContains') {
          type1 = 'text'
        } else if (conditionName == 'occurrenceDate') {
          type1 = 'date'
        }
      } else if (
        conditionName == 'top10' ||
        conditionName == 'top10%' ||
        conditionName == 'last10' ||
        conditionName == 'last10%'
      ) {
        index = 2

        if (conditionName == 'top10' || conditionName == 'top10%') {
          type1 = 'top'
        } else if (conditionName == 'last10' || conditionName == 'last10%') {
          type1 = 'last'
        }
      } else if (
        conditionName == 'AboveAverage' ||
        conditionName == 'SubAverage'
      ) {
        index = 3
        type1 = conditionName
      } else if (conditionName == 'duplicateValue') {
        index = 4
        type1 = rule['conditionValue']
      } else if (conditionName == 'formula') {
        index = 5
      }
    }

    //规则说明
    let ruleExplainHtml = _this.getRuleExplain(index)

    //弹出层
    $('#luckysheet-modal-dialog-mask').show()
    $('#luckysheet-administerRule-dialog').hide()
    $('#luckysheet-editorConditionRule-dialog').remove()

    let content =
      '<div>' +
      '<div class="boxTitle">' +
      conditionformat_Text.chooseRuleType +
      '：</div>' +
      _this.ruleTypeHtml() +
      '<div class="boxTitle">' +
      conditionformat_Text.editRuleDescription +
      '：</div>' +
      '<div class="ruleExplainBox">' +
      ruleExplainHtml +
      '</div>' +
      '</div>'

    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-editorConditionRule-dialog',
          addclass: 'luckysheet-newEditorRule-dialog',
          title: conditionformat_Text.editFormatRule,
          content: content,
          botton: `<button id="luckysheet-editorConditionRule-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button>
                        <button id="luckysheet-editorConditionRule-dialog-close" class="btn btn-default">${conditionformat_Text.cancel}</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-editorConditionRule-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 400)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-editorConditionRule-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()

    _this.colorSelectInit()

    //规则类型focus
    $(
      '#luckysheet-editorConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(' +
        index +
        ')'
    )
      .addClass('on')
      .siblings()
      .removeClass('on')

    //type1
    $('#luckysheet-editorConditionRule-dialog #type1').val(type1)
    if (
      type1 == 'dataBar' ||
      type1 == 'colorGradation' ||
      type1 == 'icons' ||
      type1 == 'number' ||
      type1 == 'text' ||
      type1 == 'date'
    ) {
      $('#luckysheet-editorConditionRule-dialog .' + type1 + 'Box').show()
      $('#luckysheet-editorConditionRule-dialog .' + type1 + 'Box')
        .siblings()
        .hide()
    }

    if (type1 == 'date') {
      _this.daterangeInit('luckysheet-editorConditionRule-dialog')
    }

    //type2  format  value
    if (
      ruleType == 'dataBar' ||
      ruleType == 'colorGradation' ||
      ruleType == 'icons'
    ) {
      if (type1 == 'dataBar') {
        if (ruleFormat.length == 2) {
          $('#luckysheet-editorConditionRule-dialog .dataBarBox #type2').val(
            'gradient'
          )
        } else if (ruleFormat.length == 1) {
          $('#luckysheet-editorConditionRule-dialog .dataBarBox #type2').val(
            'solid'
          )
        }

        $(
          '#luckysheet-editorConditionRule-dialog .dataBarBox .luckysheet-conditionformat-config-color'
        ).spectrum('set', ruleFormat[0])
      } else if (type1 == 'colorGradation') {
        if (ruleFormat.length == 3) {
          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox #type2'
          ).val('threeColor')

          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal'
          ).show()

          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color'
          ).spectrum('set', ruleFormat[0])
          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal .luckysheet-conditionformat-config-color'
          ).spectrum('set', ruleFormat[1])
          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color'
          ).spectrum('set', ruleFormat[2])
        } else if (ruleFormat.length == 2) {
          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox #type2'
          ).val('twoColor')

          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal'
          ).hide()

          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color'
          ).spectrum('set', ruleFormat[0])
          $(
            '#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color'
          ).spectrum('set', ruleFormat[1])
        }
      } else if (type1 == 'icons') {
        let len = ruleFormat['len']
        let l = ruleFormat['leftMin']
        let t = ruleFormat['top']

        $('#luckysheet-editorConditionRule-dialog .iconsBox li').each(function(
          i,
          e
        ) {
          if (
            $(e)
              .find('div')
              .attr('data-len') == len &&
            $(e)
              .find('div')
              .attr('data-leftmin') == l &&
            $(e)
              .find('div')
              .attr('data-top') == t
          ) {
            $(
              '#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model'
            ).css(
              'background-position',
              $(e)
                .find('div')
                .css('background-position')
            )
            $(
              '#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model'
            ).attr(
              'data-len',
              $(e)
                .find('div')
                .attr('data-len')
            )
            $(
              '#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model'
            ).attr(
              'data-leftmin',
              $(e)
                .find('div')
                .attr('data-leftmin')
            )
            $(
              '#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model'
            ).attr(
              'data-top',
              $(e)
                .find('div')
                .attr('data-leftmin')
            )
            $(
              '#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model'
            ).attr(
              'title',
              $(e)
                .find('div')
                .attr('title')
            )

            return true
          }
        })
      }
    } else {
      if (type1 == 'number') {
        $('#luckysheet-editorConditionRule-dialog .numberBox #type2').val(
          conditionName
        )

        let val1
        if (rule.conditionRange[0] != null) {
          val1 = getRangetxt(
            Store.currentSheetIndex,
            {
              row: rule.conditionRange[0]['row'],
              column: rule.conditionRange[0]['column'],
            },
            Store.currentSheetIndex
          )
        } else {
          val1 = rule.conditionValue[0]
        }

        $(
          '#luckysheet-editorConditionRule-dialog .numberBox #conditionVal input'
        ).val(val1)

        if (conditionName == 'betweenness') {
          $('#luckysheet-editorConditionRule-dialog .numberBox .txt').show()
          $(
            '#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2'
          ).show()

          let val2
          if (rule.conditionRange[1] != null) {
            val2 = getRangetxt(
              Store.currentSheetIndex,
              {
                row: rule.conditionRange[1]['row'],
                column: rule.conditionRange[1]['column'],
              },
              Store.currentSheetIndex
            )
          } else {
            val2 = rule.conditionValue[1]
          }

          $(
            '#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2 input'
          ).val(val2)
        } else {
          $('#luckysheet-editorConditionRule-dialog .numberBox .txt').hide()
          $(
            '#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2'
          ).hide()
        }
      } else if (type1 == 'text') {
        let val1
        if (rule.conditionRange[0] != null) {
          val1 = getRangetxt(
            Store.currentSheetIndex,
            {
              row: rule.conditionRange[0]['row'],
              column: rule.conditionRange[0]['column'],
            },
            Store.currentSheetIndex
          )
        } else {
          val1 = rule.conditionValue[0]
        }

        $(
          '#luckysheet-editorConditionRule-dialog .textBox #conditionVal input'
        ).val(val1)
      } else if (type1 == 'date') {
        _this.daterangeInit('luckysheet-editorConditionRule-dialog')

        let val1 = rule.conditionValue[0]
        $('#luckysheet-editorConditionRule-dialog .dateBox #daterange-btn').val(
          val1
        )
      } else if (type1 == 'top' || type1 == 'last') {
        let val1 = rule.conditionValue[0]

        if (conditionName == 'top10%' || conditionName == 'last10%') {
          $('#luckysheet-editorConditionRule-dialog #isPercent').attr(
            'checked',
            'checked'
          )
        }
      } else {
        if (conditionName == 'formula') {
          let val1 = rule.conditionValue[0]
          $(
            '#luckysheet-editorConditionRule-dialog #formulaConditionVal input'
          ).val(val1)
        }
      }

      $('#luckysheet-editorConditionRule-dialog #textcolorshow').spectrum(
        'set',
        ruleFormat.textColor
      )
      $('#luckysheet-editorConditionRule-dialog #cellcolorshow').spectrum(
        'set',
        ruleFormat.cellColor
      )
    }
  },
  infoDialog: function(title, content) {
    $('#luckysheet-modal-dialog-mask').show()
    $('#luckysheet-conditionformat-info-dialog').remove()
    $('body')
      .first()
      .append(
        replaceHtml(modelHTML, {
          id: 'luckysheet-conditionformat-info-dialog',
          addclass: '',
          title: title,
          content: content,
          botton: `<button id="luckysheet-conditionformat-info-dialog-close" class="btn btn-default">${
            locale().conditionformat.close
          }</button>`,
          style: 'z-index:100003',
        })
      )
    let $t = $('#luckysheet-conditionformat-info-dialog')
        .find('.luckysheet-modal-dialog-content')
        .css('min-width', 300)
        .end(),
      myh = $t.outerHeight(),
      myw = $t.outerWidth()
    let winw = $(window).width(),
      winh = $(window).height()
    let scrollLeft = $(document).scrollLeft(),
      scrollTop = $(document).scrollTop()
    $('#luckysheet-conditionformat-info-dialog')
      .css({
        left: (winw + scrollLeft - myw) / 2,
        top: (winh + scrollTop - myh) / 3,
      })
      .show()
  },
  getRuleExplain: function(index) {
    const conditionformat_Text = locale().conditionformat

    let textCellColorHtml = this.textCellColorHtml()

    let ruleExplainHtml
    switch (index) {
      case 0: //基于各自值设置所有单元格的格式
        ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem1}：</div>
                                    <div style="height: 30px;margin-bottom: 5px;">
                                        <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.formatStyle}：</label>
                                        <select id="type1">
                                            <option value="dataBar">${conditionformat_Text.dataBar}</option>
                                            <option value="colorGradation">${conditionformat_Text.colorGradation}</option>
                                            <option value="icons">${conditionformat_Text.icons}</option>
                                        </select>
                                    </div>
                                    <div>
                                        <div class="type1Box dataBarBox">
                                            <div style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.fillType}：</label>
                                                <select id="type2">
                                                    <option value="gradient">${conditionformat_Text.gradient}</option>
                                                    <option value="solid">${conditionformat_Text.solid}</option>
                                                </select>
                                            </div>
                                            <div style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.color}：</label>
                                                <input data-tips="${conditionformat_Text.dataBarColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#638ec6" style="display: none;"> 
                                            </div>
                                        </div>
                                        <div class="type1Box colorGradationBox" style="display: none;">
                                            <div style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.fillType}：</label>
                                                <select id="type2">
                                                    <option value="threeColor">${conditionformat_Text.tricolor}</option>
                                                    <option value="twoColor">${conditionformat_Text.twocolor}</option>
                                                </select>
                                            </div>
                                            <div class="maxVal" style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.maxValue}：</label>
                                                <input data-tips="${conditionformat_Text.maxValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(99, 190, 123)" style="display: none;">
                                            </div>
                                            <div class="midVal" style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.medianValue}：</label>
                                                <input data-tips="${conditionformat_Text.medianValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(255, 235, 132)" style="display: none;">
                                            </div>
                                            <div class="minVal" style="height: 30px;margin-bottom: 5px;">
                                                <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.minValue}：</label>
                                                <input data-tips="${conditionformat_Text.minValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(248, 105, 107)" style="display: none;">
                                            </div>
                                        </div>
                                        <div class="type1Box iconsBox" style="display: none;">
                                            <label>${conditionformat_Text.fillType}：</label>
                                            <div class="showbox">
                                                <div class="model" data-len="3" data-leftmin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 0;"></div>
                                                <span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s" style="margin-top: 2px;"></span>
                                            </div>
                                            <ul>
                                                <li><div data-len="3" data-leftmin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 0;"></div></li>
                                                <li><div data-len="3" data-leftmin="5" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px 0;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="1" title="${conditionformat_Text.threeTriangles}" style="background-position: 0 -20px;"></div></li>
                                                <li><div data-len="4" data-leftmin="0" data-top="2" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 -40px;"></div></li>
                                                <li><div data-len="4" data-leftmin="5" data-top="1" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px -20px;"></div></li>
                                                <li><div data-len="5" data-leftmin="0" data-top="3" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 -60px;"></div></li>
                                                <li><div data-len="5" data-leftmin="5" data-top="2" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px -40px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})" style="background-position: 0 -80px;"></div></li>
                                                <li><div data-len="3" data-leftmin="5" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})" style="background-position: -131px -80px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="5" title="${conditionformat_Text.threeSigns}" style="background-position: 0 -100px;"></div></li>
                                                <li><div data-len="4" data-leftmin="5" data-top="5" title="${conditionformat_Text.fourColorTrafficLight}" style="background-position: -131px -100px;"></div></li>
                                                <li><div data-len="4" data-leftmin="0" data-top="6" title="${conditionformat_Text.greenRedBlackGradient}" style="background-position: 0 -120px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})" style="background-position: 0 -140px;"></div></li>
                                                <li><div data-len="3" data-leftmin="5" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})" style="background-position: -131px -140px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="8" title="${conditionformat_Text.tricolorFlag}" style="background-position: 0 -160px;"></div></li>
                                                <li><div data-len="3" data-leftmin="0" data-top="9" title="${conditionformat_Text.threeStars}" style="background-position: 0 -180px;"></div></li>
                                                <li><div data-len="5" data-leftmin="0" data-top="10" title="${conditionformat_Text.fiveQuadrantDiagram}" style="background-position: 0 -200px;"></div></li>
                                                <li><div data-len="5" data-leftmin="0" data-top="11" title="${conditionformat_Text.fiveBoxes}" style="background-position: 0 -220px;"></div></li>
                                                <li><div data-len="4" data-leftmin="5" data-top="9" title="${conditionformat_Text.grade4}" style="background-position: -131px -180px;"></div></li>
                                                <li><div data-len="5" data-leftmin="5" data-top="10" title="${conditionformat_Text.grade5}" style="background-position: -131px -200px;"></div></li>
                                            </ul>
                                        </div>
                                    </div>`
        break
      case 1: //只为包含以下内容的单元格设置格式
        ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem2_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="number">${conditionformat_Text.cellValue}</option>
                                            <option value="text">${conditionformat_Text.specificText}</option>
                                            <option value="date">${conditionformat_Text.occurrence}</option>
                                        </select>
                                        <div>
                                            <div class="type1Box numberBox">
                                                <select id="type2">
                                                    <option value="greaterThan">${conditionformat_Text.greaterThan}</option>
                                                    <option value="lessThan">${conditionformat_Text.lessThan}</option>
                                                    <option value="betweenness">${conditionformat_Text.between}</option>
                                                    <option value="equal">${conditionformat_Text.equal}</option>
                                                </select>
                                                <div class="inpbox range" id="conditionVal">
                                                    <input class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i>
                                                </div>
                                                <span class="txt" style="display: none;">${conditionformat_Text.in}</span>
                                                <div class="inpbox range" id="conditionVal2" style="display: none;">
                                                    <input class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectDataRange}"></i>
                                                </div>
                                            </div>
                                            <div class="type1Box textBox" style="display: none;">
                                                <select id="type2">
                                                    <option value="">${conditionformat_Text.contain}</option>
                                                </select>
                                                <div class="inpbox range" id="conditionVal">
                                                    <input class="formulaInputFocus"/>
                                                    <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i>
                                                </div>
                                            </div>
                                            <div class="type1Box dateBox" style="display: none;">
                                                <div style="width: 162px;" class="inpbox">
                                                    <input style="width: 150px;" id="daterange-btn" readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectADate}"/>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`
        break
      case 2: //仅对排名靠前或靠后的数值设置格式
        ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem3_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="top">${conditionformat_Text.top}</option>
                                            <option value="last">${conditionformat_Text.last}</option>
                                        </select>
                                        <div class="inpbox" id="conditionVal">
                                            <input class="formulaInputFocus" type="number" value="10"/>
                                        </div>
                                        <input id="isPercent" type="checkbox"/>
                                        <label for="isPercent" class="txt">${conditionformat_Text.selectRange_percent}</label>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`
        break
      case 3: //仅对高于或低于平均值的数值设置格式
        ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem4_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="AboveAverage">${conditionformat_Text.above}</option>
                                            <option value="SubAverage">${conditionformat_Text.below}</option>
                                        </select>
                                        <span class="txt">${conditionformat_Text.selectRange_average}</span>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`
        break
      case 4: //仅对唯一值或重复值设置格式
        ruleExplainHtml = `<div class="title">${conditionformat_Text.all}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <select id="type1">
                                            <option value="0">${conditionformat_Text.duplicateValue}</option>
                                            <option value="1">${conditionformat_Text.uniqueValue}</option>
                                        </select>
                                        <span class="txt">${conditionformat_Text.selectRange_value}</span>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`
        break
      case 5: //使用公式确定要设置格式的单元格
        ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem2_title}：</div>
                                    <div style="height: 30px;margin-bottom: 10px;">
                                        <div class="inpbox range" id="formulaConditionVal" style="width: 250px;">
                                            <input class="formulaInputFocus" style="width: 200px;"/>
                                            <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i>
                                        </div>
                                    </div>
                                    <div class="title">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`
        break
    }

    return ruleExplainHtml
  },
  daterangeInit: function(id) {
    const conditionformat_Text = locale().conditionformat

    //日期选择插件
    $('.ranges_1 ul').remove()
    $('#' + id)
      .find('#daterange-btn')
      .flatpickr({
        mode: 'range',
        onChange: function(data, label) {
          const [start, end] = data
          //label:通过它来知道用户选择的是什么，传给后台进行相应的展示
          let format1 = [
            conditionformat_Text.yesterday,
            conditionformat_Text.today,
          ]

          let format2 = [
            conditionformat_Text.lastWeek,
            conditionformat_Text.thisWeek,
            conditionformat_Text.lastMonth,
            conditionformat_Text.thisMonth,
            conditionformat_Text.lastYear,
            conditionformat_Text.thisYear,
            conditionformat_Text.last7days,
            conditionformat_Text.last30days,
          ]

          if (label == conditionformat_Text.all) {
            $('#daterange-btn').val('')
          } else if (format1.indexOf(label) > -1) {
            $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD'))
          } else if (format2.indexOf(label) > -1) {
            $('#daterange-btn').val(
              dayjs(start).format('YYYY/MM/DD') +
                '-' +
                dayjs(end).format('YYYY/MM/DD')
            )
          }
        },
      })
  },
  CFSplitRange: function(range1, range2, range3, type) {
    let range = []

    let offset_r = range3['row'][0] - range2['row'][0]
    let offset_c = range3['column'][0] - range2['column'][0]

    let r1 = range1['row'][0],
      r2 = range1['row'][1]
    let c1 = range1['column'][0],
      c2 = range1['column'][1]

    if (
      r1 >= range2['row'][0] &&
      r2 <= range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 全部

      if (type == 'allPart') {
        //所有部分
        range = [
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = []
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      r1 >= range2['row'][0] &&
      r1 <= range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 行贯穿 条件格式应用范围 上部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [{ row: [range2['row'][1] + 1, r2], column: [c1, c2] }]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      r2 >= range2['row'][0] &&
      r2 <= range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 行贯穿 条件格式应用范围 下部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [{ row: [r1, range2['row'][0] - 1], column: [c1, c2] }]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      r1 < range2['row'][0] &&
      r2 > range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 行贯穿 条件格式应用范围 中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      c1 >= range2['column'][0] &&
      c1 <= range2['column'][1] &&
      r1 >= range2['row'][0] &&
      r2 <= range2['row'][1]
    ) {
      //选区 列贯穿 条件格式应用范围 左部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, r2], column: [range2['column'][1] + 1, c2] },
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [{ row: [r1, r2], column: [range2['column'][1] + 1, c2] }]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      }
    } else if (
      c2 >= range2['column'][0] &&
      c2 <= range2['column'][1] &&
      r1 >= range2['row'][0] &&
      r2 <= range2['row'][1]
    ) {
      //选区 列贯穿 条件格式应用范围 右部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, r2], column: [c1, range2['column'][0] - 1] },
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [{ row: [r1, r2], column: [c1, range2['column'][0] - 1] }]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      c1 < range2['column'][0] &&
      c2 > range2['column'][1] &&
      r1 >= range2['row'][0] &&
      r2 <= range2['row'][1]
    ) {
      //选区 列贯穿 条件格式应用范围 中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, r2], column: [c1, range2['column'][0] - 1] },
          { row: [r1, r2], column: [range2['column'][1] + 1, c2] },
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, r2], column: [c1, range2['column'][0] - 1] },
          { row: [r1, r2], column: [range2['column'][1] + 1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, r2 + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      }
    } else if (
      r1 >= range2['row'][0] &&
      r1 <= range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c1 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 左上角部分

      if (type == 'allPart') {
        //所有部分
        range = [
          {
            row: [r1, range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          {
            row: [r1, range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      }
    } else if (
      r1 >= range2['row'][0] &&
      r1 <= range2['row'][1] &&
      c2 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 右上角部分

      if (type == 'allPart') {
        //所有部分
        range = [
          {
            row: [r1, range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          {
            row: [r1, range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      r2 >= range2['row'][0] &&
      r2 <= range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c1 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 左下角部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], r2],
            column: [range2['column'][1] + 1, c2],
          },
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], r2],
            column: [range2['column'][1] + 1, c2],
          },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      }
    } else if (
      r2 >= range2['row'][0] &&
      r2 <= range2['row'][1] &&
      c2 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 右下角部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], r2],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], r2],
            column: [c1, range2['column'][0] - 1],
          },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      r1 < range2['row'][0] &&
      r2 > range2['row'][1] &&
      c1 >= range2['column'][0] &&
      c1 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 左中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [c1 + offset_c, range2['column'][1] + offset_c],
          },
        ]
      }
    } else if (
      r1 < range2['row'][0] &&
      r2 > range2['row'][1] &&
      c2 >= range2['column'][0] &&
      c2 <= range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 右中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [range2['column'][0] + offset_c, c2 + offset_c],
          },
        ]
      }
    } else if (
      c1 < range2['column'][0] &&
      c2 > range2['column'][1] &&
      r1 >= range2['row'][0] &&
      r1 <= range2['row'][1]
    ) {
      //选区 包含 条件格式应用范围 上中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          {
            row: [r1, range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [r1, range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          {
            row: [r1, range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [r1, range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [r1 + offset_r, range2['row'][1] + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      }
    } else if (
      c1 < range2['column'][0] &&
      c2 > range2['column'][1] &&
      r2 >= range2['row'][0] &&
      r2 <= range2['row'][1]
    ) {
      //选区 包含 条件格式应用范围 下中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], r2],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [range2['row'][0], r2],
            column: [range2['column'][1] + 1, c2],
          },
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], r2],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [range2['row'][0], r2],
            column: [range2['column'][1] + 1, c2],
          },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, r2 + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      }
    } else if (
      r1 < range2['row'][0] &&
      r2 > range2['row'][1] &&
      c1 < range2['column'][0] &&
      c2 > range2['column'][1]
    ) {
      //选区 包含 条件格式应用范围 正中间部分

      if (type == 'allPart') {
        //所有部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      } else if (type == 'restPart') {
        //剩余部分
        range = [
          { row: [r1, range2['row'][0] - 1], column: [c1, c2] },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [c1, range2['column'][0] - 1],
          },
          {
            row: [range2['row'][0], range2['row'][1]],
            column: [range2['column'][1] + 1, c2],
          },
          { row: [range2['row'][1] + 1, r2], column: [c1, c2] },
        ]
      } else if (type == 'operatePart') {
        //操作部分
        range = [
          {
            row: [range2['row'][0] + offset_r, range2['row'][1] + offset_r],
            column: [
              range2['column'][0] + offset_c,
              range2['column'][1] + offset_c,
            ],
          },
        ]
      }
    } else {
      //选区 在 条件格式应用范围 之外

      if (type == 'allPart') {
        //所有部分
        range = [{ row: [r1, r2], column: [c1, c2] }]
      } else if (type == 'restPart') {
        //剩余部分
        range = [{ row: [r1, r2], column: [c1, c2] }]
      } else if (type == 'operatePart') {
        //操作部分
        range = []
      }
    }

    return range
  },
  getcolorGradation: function(color1, color2, value1, value2, value) {
    let rgb1 = color1.split(',')
    let r1 = parseInt(rgb1[0].split('(')[1])
    let g1 = parseInt(rgb1[1])
    let b1 = parseInt(rgb1[2].split(')')[0])

    let rgb2 = color2.split(',')
    let r2 = parseInt(rgb2[0].split('(')[1])
    let g2 = parseInt(rgb2[1])
    let b2 = parseInt(rgb2[2].split(')')[0])

    let r = Math.round(r1 - ((r1 - r2) / (value1 - value2)) * (value1 - value))
    let g = Math.round(g1 - ((g1 - g2) / (value1 - value2)) * (value1 - value))
    let b = Math.round(b1 - ((b1 - b2) / (value1 - value2)) * (value1 - value))

    return 'rgb(' + r + ', ' + g + ', ' + b + ')'
  },
  getCFPartRange: function(sheetIndex, range1, range2) {
    let ruleArr = []

    let cf =
      Store.luckysheetfile[getSheetIndex(sheetIndex)]
        .luckysheet_conditionformat_save
    if (cf != null && cf.length > 0) {
      label: for (let i = 0; i < cf.length; i++) {
        let cellrange = cf[i].cellrange

        for (let j = 0; j < cellrange.length; j++) {
          let r1 = cellrange[j].row[0],
            r2 = cellrange[j].row[1]
          let c1 = cellrange[j].column[0],
            c2 = cellrange[j].column[1]

          for (let s = 0; s < range.length; s++) {
            if (
              (range[s].row[0] >= r1 && range[s].row[0] <= r2) ||
              (range[s].row[1] >= r1 && range[s].row[1] <= r2) ||
              (range[s].column[0] >= c1 && range[s].column[0] <= c2) ||
              (range[s].column[1] >= c1 && range[s].column[1] <= c2)
            ) {
              ruleArr.push(cf[i])

              continue label
            }
          }
        }
      }
    }

    return ruleArr
  },
  checksCF: function(r, c, computeMap) {
    if (computeMap != null && r + '_' + c in computeMap) {
      return computeMap[r + '_' + c]
    } else {
      return null
    }
  },
  getComputeMap: function(sheetIndex) {
    let index = getSheetIndex(Store.currentSheetIndex)

    if (sheetIndex != null) {
      index = getSheetIndex(sheetIndex)
    }

    let ruleArr = Store.luckysheetfile[index]['luckysheet_conditionformat_save']
    let data = Store.luckysheetfile[index]['data']

    if (data == null) {
      return null
    }

    let computeMap = this.compute(ruleArr, data)

    return computeMap
  },
  compute: function(ruleArr, d) {
    let _this = this

    if (ruleArr == null) {
      ruleArr = []
    }

    //条件计算存储
    let computeMap = {}

    if (ruleArr.length > 0) {
      for (let i = 0; i < ruleArr.length; i++) {
        let type = ruleArr[i]['type']
        let cellrange = ruleArr[i]['cellrange']
        let format = ruleArr[i]['format']

        if (type == 'dataBar') {
          //数据条
          let max = null,
            min = null

          for (let s = 0; s < cellrange.length; s++) {
            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
              for (
                let c = cellrange[s].column[0];
                c <= cellrange[s].column[1];
                c++
              ) {
                if (d[r] == null || d[r][c] == null) {
                  continue
                }

                let cell = d[r][c]

                if (
                  getObjType(cell) == 'object' &&
                  cell['ct'] != null &&
                  cell['ct'].t == 'n' &&
                  cell.v != null
                ) {
                  if (max == null || parseInt(cell.v) > max) {
                    max = parseInt(cell.v)
                  }

                  if (min == null || parseInt(cell.v) < min) {
                    min = parseInt(cell.v)
                  }
                }
              }
            }
          }

          if (max != null && min != null) {
            if (min < 0) {
              //选区范围内有负数
              let plusLen = Math.round((max / (max - min)) * 10) / 10 //正数所占比
              let minusLen = Math.round((Math.abs(min) / (max - min)) * 10) / 10 //负数所占比

              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      if (parseInt(cell.v) < 0) {
                        //负数
                        let valueLen =
                          Math.round(
                            (Math.abs(parseInt(cell.v)) / Math.abs(min)) * 100
                          ) / 100

                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['dataBar'] = {
                            valueType: 'minus',
                            minusLen: minusLen,
                            valueLen: valueLen,
                            format: format,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            dataBar: {
                              valueType: 'minus',
                              minusLen: minusLen,
                              valueLen: valueLen,
                              format: format,
                            },
                          }
                        }
                      }

                      if (parseInt(cell.v) > 0) {
                        //正数
                        let valueLen =
                          Math.round((parseInt(cell.v) / max) * 100) / 100

                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['dataBar'] = {
                            valueType: 'plus',
                            plusLen: plusLen,
                            minusLen: minusLen,
                            valueLen: valueLen,
                            format: format,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            dataBar: {
                              valueType: 'plus',
                              plusLen: plusLen,
                              minusLen: minusLen,
                              valueLen: valueLen,
                              format: format,
                            },
                          }
                        }
                      }
                    }
                  }
                }
              }
            } else {
              let plusLen = 1

              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      let valueLen
                      if (max == 0) {
                        valueLen = 1
                      } else {
                        valueLen =
                          Math.round((parseInt(cell.v) / max) * 100) / 100
                      }

                      if (r + '_' + c in computeMap) {
                        computeMap[r + '_' + c]['dataBar'] = {
                          valueType: 'plus',
                          plusLen: plusLen,
                          valueLen: valueLen,
                          format: format,
                        }
                      } else {
                        computeMap[r + '_' + c] = {
                          dataBar: {
                            valueType: 'plus',
                            plusLen: plusLen,
                            valueLen: valueLen,
                            format: format,
                          },
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        } else if (type == 'colorGradation') {
          //色阶
          let max = null,
            min = null,
            sum = 0,
            count = 0

          for (let s = 0; s < cellrange.length; s++) {
            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
              for (
                let c = cellrange[s].column[0];
                c <= cellrange[s].column[1];
                c++
              ) {
                if (d[r] == null || d[r][c] == null) {
                  continue
                }

                let cell = d[r][c]

                if (
                  getObjType(cell) == 'object' &&
                  cell['ct'] != null &&
                  cell['ct'].t == 'n' &&
                  cell.v != null
                ) {
                  count++
                  sum += parseInt(cell.v)

                  if (max == null || parseInt(cell.v) > max) {
                    max = parseInt(cell.v)
                  }

                  if (min == null || parseInt(cell.v) < min) {
                    min = parseInt(cell.v)
                  }
                }
              }
            }
          }

          if (max != null && min != null) {
            if (format.length == 3) {
              //三色色阶
              let avg = Math.floor(sum / count)

              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      if (parseInt(cell.v) == min) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['cellColor'] = format[2]
                        } else {
                          computeMap[r + '_' + c] = { cellColor: format[2] }
                        }
                      } else if (
                        parseInt(cell.v) > min &&
                        parseInt(cell.v) < avg
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c][
                            'cellColor'
                          ] = _this.getcolorGradation(
                            format[2],
                            format[1],
                            min,
                            avg,
                            parseInt(cell.v)
                          )
                        } else {
                          computeMap[r + '_' + c] = {
                            cellColor: _this.getcolorGradation(
                              format[2],
                              format[1],
                              min,
                              avg,
                              parseInt(cell.v)
                            ),
                          }
                        }
                      } else if (parseInt(cell.v) == avg) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['cellColor'] = format[1]
                        } else {
                          computeMap[r + '_' + c] = { cellColor: format[1] }
                        }
                      } else if (
                        parseInt(cell.v) > avg &&
                        parseInt(cell.v) < max
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c][
                            'cellColor'
                          ] = _this.getcolorGradation(
                            format[1],
                            format[0],
                            avg,
                            max,
                            parseInt(cell.v)
                          )
                        } else {
                          computeMap[r + '_' + c] = {
                            cellColor: _this.getcolorGradation(
                              format[1],
                              format[0],
                              avg,
                              max,
                              parseInt(cell.v)
                            ),
                          }
                        }
                      } else if (parseInt(cell.v) == max) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['cellColor'] = format[0]
                        } else {
                          computeMap[r + '_' + c] = { cellColor: format[0] }
                        }
                      }
                    }
                  }
                }
              }
            } else if (format.length == 2) {
              //两色色阶
              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      if (parseInt(cell.v) == min) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['cellColor'] = format[1]
                        } else {
                          computeMap[r + '_' + c] = { cellColor: format[1] }
                        }
                      } else if (
                        parseInt(cell.v) > min &&
                        parseInt(cell.v) < max
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c][
                            'cellColor'
                          ] = _this.getcolorGradation(
                            format[1],
                            format[0],
                            min,
                            max,
                            parseInt(cell.v)
                          )
                        } else {
                          computeMap[r + '_' + c] = {
                            cellColor: _this.getcolorGradation(
                              format[1],
                              format[0],
                              min,
                              max,
                              parseInt(cell.v)
                            ),
                          }
                        }
                      } else if (parseInt(cell.v) == max) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['cellColor'] = format[0]
                        } else {
                          computeMap[r + '_' + c] = { cellColor: format[0] }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        } else if (type == 'icons') {
          //图标集
          let len = parseInt(format['len'])
          let leftMin = parseInt(format['leftMin'])
          let top = parseInt(format['top'])

          let max = null,
            min = null

          for (let s = 0; s < cellrange.length; s++) {
            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
              for (
                let c = cellrange[s].column[0];
                c <= cellrange[s].column[1];
                c++
              ) {
                if (d[r] == null || d[r][c] == null) {
                  continue
                }

                let cell = d[r][c]

                if (
                  getObjType(cell) == 'object' &&
                  cell['ct'] != null &&
                  cell['ct'].t == 'n' &&
                  cell.v != null
                ) {
                  if (max == null || parseInt(cell.v) > max) {
                    max = parseInt(cell.v)
                  }

                  if (min == null || parseInt(cell.v) < min) {
                    min = parseInt(cell.v)
                  }
                }
              }
            }
          }

          if (max != null && min != null) {
            let a = Math.floor((max - min + 1) / len)
            let b = (max - min + 1) % len

            if (len == 3) {
              //一组图标有三个
              let v1, v2, v3
              if (b == 2) {
                v1 = [min, min + a]
                v2 = [min + a + 1, min + a * 2]
                v3 = [min + a * 2 + 1, max]
              } else {
                v1 = [min, min + a - 1]
                v2 = [min + a, min + a * 2 - 1]
                v3 = [min + a * 2, max]
              }

              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      if (
                        parseInt(cell.v) >= v1[0] &&
                        parseInt(cell.v) <= v1[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 2,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 2, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v2[0] &&
                        parseInt(cell.v) <= v2[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 1,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 1, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v3[0] &&
                        parseInt(cell.v) <= v3[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin, top: top },
                          }
                        }
                      }
                    }
                  }
                }
              }
            } else if (len == 4) {
              //一组图标有四个
              let v1, v2, v3, v4
              if (b == 2) {
                v1 = [min, min + a]
                v2 = [min + a + 1, min + a * 2]
                v3 = [min + a * 2 + 1, min + a * 3]
                v4 = [min + a * 3 + 1, max]
              } else if (b == 3) {
                v1 = [min, min + a]
                v2 = [min + a + 1, min + a * 2]
                v3 = [min + a * 2 + 1, min + a * 3 + 1]
                v4 = [min + a * 3 + 2, max]
              } else {
                v1 = [min, min + a - 1]
                v2 = [min + a, min + a * 2 - 1]
                v3 = [min + a * 2, min + a * 3 - 1]
                v4 = [min + a * 3, max]
              }

              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      if (
                        parseInt(cell.v) >= v1[0] &&
                        parseInt(cell.v) <= v1[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 3,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 3, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v2[0] &&
                        parseInt(cell.v) <= v2[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 2,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 2, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v3[0] &&
                        parseInt(cell.v) <= v3[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 1,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 1, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v4[0] &&
                        parseInt(cell.v) <= v4[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin, top: top },
                          }
                        }
                      }
                    }
                  }
                }
              }
            } else if (len == 5) {
              //一组图标有五个
              let v1, v2, v3, v4, v5
              if (b == 2) {
                v1 = [min, min + a]
                v2 = [min + a + 1, min + a * 2]
                v3 = [min + a * 2 + 1, min + a * 3]
                v4 = [min + a * 3 + 1, min + a * 4]
                v5 = [min + a * 4 + 1, max]
              } else if (b == 3) {
                v1 = [min, min + a]
                v2 = [min + a + 1, min + a * 2]
                v3 = [min + a * 2 + 1, min + a * 3 + 1]
                v4 = [min + a * 3 + 2, min + a * 4 + 1]
                v5 = [min + a * 4 + 2, max]
              } else if (b == 4) {
                v1 = [min, min + a]
                v2 = [min + a + 1, min + a * 2 + 1]
                v3 = [min + a * 2 + 2, min + a * 3 + 1]
                v4 = [min + a * 3 + 2, min + a * 4 + 2]
                v5 = [min + a * 4 + 3, max]
              } else {
                v1 = [min, min + a - 1]
                v2 = [min + a, min + a * 2 - 1]
                v3 = [min + a * 2, min + a * 3 - 1]
                v4 = [min + a * 3, min + a * 4 - 1]
                v5 = [min + a * 4, max]
              }

              for (let s = 0; s < cellrange.length; s++) {
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    let cell = d[r][c]

                    if (
                      getObjType(cell) == 'object' &&
                      cell['ct'] != null &&
                      cell['ct'].t == 'n' &&
                      cell.v != null
                    ) {
                      if (
                        parseInt(cell.v) >= v1[0] &&
                        parseInt(cell.v) <= v1[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 4,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 4, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v2[0] &&
                        parseInt(cell.v) <= v2[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 3,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 3, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v3[0] &&
                        parseInt(cell.v) <= v3[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 2,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 2, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v4[0] &&
                        parseInt(cell.v) <= v4[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin + 1,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin + 1, top: top },
                          }
                        }
                      } else if (
                        parseInt(cell.v) >= v5[0] &&
                        parseInt(cell.v) <= v5[1]
                      ) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['icons'] = {
                            left: leftMin,
                            top: top,
                          }
                        } else {
                          computeMap[r + '_' + c] = {
                            icons: { left: leftMin, top: top },
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        } else {
          //获取变量值
          let conditionName = ruleArr[i].conditionName, //条件名称
            conditionValue0 = ruleArr[i].conditionValue[0], //条件值1
            conditionValue1 = ruleArr[i].conditionValue[1], //条件值2
            textColor = format.textColor, //条件格式文本颜色 fc
            cellColor = format.cellColor //条件格式单元格颜色 bg

          for (let s = 0; s < cellrange.length; s++) {
            //条件类型判断
            if (
              conditionName == 'greaterThan' ||
              conditionName == 'lessThan' ||
              conditionName == 'equal' ||
              conditionName == 'textContains'
            ) {
              //循环应用范围计算
              for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                for (
                  let c = cellrange[s].column[0];
                  c <= cellrange[s].column[1];
                  c++
                ) {
                  if (d[r] == null || d[r][c] == null) {
                    continue
                  }

                  //单元格值
                  let cell = d[r][c]

                  if (getObjType(cell) != 'object' || isRealNull(cell.v)) {
                    continue
                  }

                  //符合条件
                  if (
                    conditionName == 'greaterThan' &&
                    cell.v > conditionValue0
                  ) {
                    if (r + '_' + c in computeMap) {
                      computeMap[r + '_' + c]['textColor'] = textColor
                      computeMap[r + '_' + c]['cellColor'] = cellColor
                    } else {
                      computeMap[r + '_' + c] = {
                        textColor: textColor,
                        cellColor: cellColor,
                      }
                    }
                  } else if (
                    conditionName == 'lessThan' &&
                    cell.v < conditionValue0
                  ) {
                    if (r + '_' + c in computeMap) {
                      computeMap[r + '_' + c]['textColor'] = textColor
                      computeMap[r + '_' + c]['cellColor'] = cellColor
                    } else {
                      computeMap[r + '_' + c] = {
                        textColor: textColor,
                        cellColor: cellColor,
                      }
                    }
                  } else if (
                    conditionName == 'equal' &&
                    cell.v == conditionValue0
                  ) {
                    if (r + '_' + c in computeMap) {
                      computeMap[r + '_' + c]['textColor'] = textColor
                      computeMap[r + '_' + c]['cellColor'] = cellColor
                    } else {
                      computeMap[r + '_' + c] = {
                        textColor: textColor,
                        cellColor: cellColor,
                      }
                    }
                  } else if (
                    conditionName == 'textContains' &&
                    cell.v.toString().indexOf(conditionValue0) != -1
                  ) {
                    if (r + '_' + c in computeMap) {
                      computeMap[r + '_' + c]['textColor'] = textColor
                      computeMap[r + '_' + c]['cellColor'] = cellColor
                    } else {
                      computeMap[r + '_' + c] = {
                        textColor: textColor,
                        cellColor: cellColor,
                      }
                    }
                  }
                }
              }
            } else if (conditionName == 'betweenness') {
              //比较条件值1和条件值2的大小
              let vBig, vSmall
              if (conditionValue0 > conditionValue1) {
                vBig = conditionValue0
                vSmall = conditionValue1
              } else {
                vBig = conditionValue1
                vSmall = conditionValue0
              }
              //循环应用范围计算
              for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                for (
                  let c = cellrange[s].column[0];
                  c <= cellrange[s].column[1];
                  c++
                ) {
                  if (d[r] == null || d[r][c] == null) {
                    continue
                  }

                  //单元格值
                  let cell = d[r][c]

                  if (getObjType(cell) != 'object' || isRealNull(cell.v)) {
                    continue
                  }

                  //符合条件
                  if (cell.v >= vSmall && cell.v <= vBig) {
                    if (r + '_' + c in computeMap) {
                      computeMap[r + '_' + c]['textColor'] = textColor
                      computeMap[r + '_' + c]['cellColor'] = cellColor
                    } else {
                      computeMap[r + '_' + c] = {
                        textColor: textColor,
                        cellColor: cellColor,
                      }
                    }
                  }
                }
              }
            } else if (conditionName == 'occurrenceDate') {
              //获取日期所对应的数值
              let dBig, dSmall
              if (conditionValue0.toString().indexOf('-') == -1) {
                dBig = genarate(conditionValue0)[2]
                dSmall = genarate(conditionValue0)[2]
              } else {
                let str = conditionValue0.toString().split('-')
                dBig = genarate(str[1].trim())[2]
                dSmall = genarate(str[0].trim())[2]
              }
              //循环应用范围计算
              for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                for (
                  let c = cellrange[s].column[0];
                  c <= cellrange[s].column[1];
                  c++
                ) {
                  if (d[r] == null || d[r][c] == null) {
                    continue
                  }

                  //单元格值类型为日期类型
                  if (d[r][c].ct != null && d[r][c].ct.t == 'd') {
                    //单元格值
                    let cellVal = getcellvalue(r, c, d)
                    //符合条件
                    if (cellVal >= dSmall && cellVal <= dBig) {
                      if (r + '_' + c in computeMap) {
                        computeMap[r + '_' + c]['textColor'] = textColor
                        computeMap[r + '_' + c]['cellColor'] = cellColor
                      } else {
                        computeMap[r + '_' + c] = {
                          textColor: textColor,
                          cellColor: cellColor,
                        }
                      }
                    }
                  }
                }
              }
            } else if (conditionName == 'duplicateValue') {
              //应用范围单元格值处理
              let dmap = {}
              for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                for (
                  let c = cellrange[s].column[0];
                  c <= cellrange[s].column[1];
                  c++
                ) {
                  let item = getcellvalue(r, c, d)
                  if (!(item in dmap)) {
                    dmap[item] = []
                  }
                  dmap[item].push({ r: r, c: c })
                }
              }
              //循环应用范围计算
              if (conditionValue0 == '0') {
                //重复值
                for (let x in dmap) {
                  if (x != 'null' && x != 'undefined' && dmap[x].length > 1) {
                    for (let j = 0; j < dmap[x].length; j++) {
                      if (dmap[x][j].r + '_' + dmap[x][j].c in computeMap) {
                        computeMap[dmap[x][j].r + '_' + dmap[x][j].c][
                          'textColor'
                        ] = textColor
                        computeMap[dmap[x][j].r + '_' + dmap[x][j].c][
                          'cellColor'
                        ] = cellColor
                      } else {
                        computeMap[dmap[x][j].r + '_' + dmap[x][j].c] = {
                          textColor: textColor,
                          cellColor: cellColor,
                        }
                      }
                    }
                  }
                }
              }
              if (conditionValue0 == '1') {
                //唯一值
                for (let x in dmap) {
                  if (x != 'null' && x != 'undefined' && dmap[x].length == 1) {
                    if (dmap[x][0].r + '_' + dmap[x][0].c in computeMap) {
                      computeMap[dmap[x][0].r + '_' + dmap[x][0].c][
                        'textColor'
                      ] = textColor
                      computeMap[dmap[x][0].r + '_' + dmap[x][0].c][
                        'cellColor'
                      ] = cellColor
                    } else {
                      computeMap[dmap[x][0].r + '_' + dmap[x][0].c] = {
                        textColor: textColor,
                        cellColor: cellColor,
                      }
                    }
                  }
                }
              }
            } else if (
              conditionName == 'top10' ||
              conditionName == 'top10%' ||
              conditionName == 'last10' ||
              conditionName == 'last10%' ||
              conditionName == 'AboveAverage' ||
              conditionName == 'SubAverage'
            ) {
              //应用范围单元格值(数值型)
              let dArr = []
              for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {
                for (
                  let c = cellrange[s].column[0];
                  c <= cellrange[s].column[1];
                  c++
                ) {
                  if (d[r] == null || d[r][c] == null) {
                    continue
                  }

                  //单元格值类型为数字类型
                  if (d[r][c].ct != null && d[r][c].ct.t == 'n') {
                    dArr.push(getcellvalue(r, c, d))
                  }
                }
              }
              //数组处理
              if (
                conditionName == 'top10' ||
                conditionName == 'top10%' ||
                conditionName == 'last10' ||
                conditionName == 'last10%'
              ) {
                //从大到小排序
                for (let j = 0; j < dArr.length; j++) {
                  for (let k = 0; k < dArr.length - 1 - j; k++) {
                    if (dArr[k] < dArr[k + 1]) {
                      let temp = dArr[k]
                      dArr[k] = dArr[k + 1]
                      dArr[k + 1] = temp
                    }
                  }
                }
                //取条件值数组
                let cArr
                if (conditionName == 'top10') {
                  cArr = dArr.slice(0, conditionValue0) //前10项数组
                } else if (conditionName == 'top10%') {
                  cArr = dArr.slice(
                    0,
                    Math.floor((conditionValue0 * dArr.length) / 100)
                  ) //前10%数组
                } else if (conditionName == 'last10') {
                  cArr = dArr.slice(dArr.length - conditionValue0, dArr.length) //最后10项数组
                } else if (conditionName == 'last10%') {
                  cArr = dArr.slice(
                    dArr.length -
                      Math.floor((conditionValue0 * dArr.length) / 100),
                    dArr.length
                  ) //最后10%数组
                }
                //循环应用范围计算
                for (
                  let r = cellrange[s].row[0];
                  r <= cellrange[s].row[1];
                  r++
                ) {
                  for (
                    let c = cellrange[s].column[0];
                    c <= cellrange[s].column[1];
                    c++
                  ) {
                    if (d[r] == null || d[r][c] == null) {
                      continue
                    }

                    //单元格值
                    let cellVal = getcellvalue(r, c, d)
                    //符合条件
                    if (cArr.indexOf(cellVal) != -1) {
                      if (r + '_' + c in computeMap) {
                        computeMap[r + '_' + c]['textColor'] = textColor
                        computeMap[r + '_' + c]['cellColor'] = cellColor
                      } else {
                        computeMap[r + '_' + c] = {
                          textColor: textColor,
                          cellColor: cellColor,
                        }
                      }
                    }
                  }
                }
              } else if (
                conditionName == 'AboveAverage' ||
                conditionName == 'SubAverage'
              ) {
                //计算数组平均值
                let sum = 0
                for (let j = 0; j < dArr.length; j++) {
                  sum += dArr[j]
                }
                let averageNum = sum / dArr.length
                //循环应用范围计算
                if (conditionName == 'AboveAverage') {
                  //高于平均值
                  for (
                    let r = cellrange[s].row[0];
                    r <= cellrange[s].row[1];
                    r++
                  ) {
                    for (
                      let c = cellrange[s].column[0];
                      c <= cellrange[s].column[1];
                      c++
                    ) {
                      if (d[r] == null || d[r][c] == null) {
                        continue
                      }

                      //单元格值
                      let cellVal = getcellvalue(r, c, d)
                      //符合条件
                      if (cellVal > averageNum) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['textColor'] = textColor
                          computeMap[r + '_' + c]['cellColor'] = cellColor
                        } else {
                          computeMap[r + '_' + c] = {
                            textColor: textColor,
                            cellColor: cellColor,
                          }
                        }
                      }
                    }
                  }
                } else if (conditionName == 'SubAverage') {
                  //低于平均值
                  for (
                    let r = cellrange[s].row[0];
                    r <= cellrange[s].row[1];
                    r++
                  ) {
                    for (
                      let c = cellrange[s].column[0];
                      c <= cellrange[s].column[1];
                      c++
                    ) {
                      if (d[r] == null || d[r][c] == null) {
                        continue
                      }

                      //单元格值
                      let cellVal = getcellvalue(r, c, d)
                      //符合条件
                      if (cellVal < averageNum) {
                        if (r + '_' + c in computeMap) {
                          computeMap[r + '_' + c]['textColor'] = textColor
                          computeMap[r + '_' + c]['cellColor'] = cellColor
                        } else {
                          computeMap[r + '_' + c] = {
                            textColor: textColor,
                            cellColor: cellColor,
                          }
                        }
                      }
                    }
                  }
                }
              }
            } else if (conditionName == 'formula') {
              let str = cellrange[s].row[0],
                edr = cellrange[s].row[1],
                stc = cellrange[s].column[0],
                edc = cellrange[s].column[1]

              let formulaTxt = conditionValue0
              if (conditionValue0.toString().slice(0, 1) != '=') {
                formulaTxt = '=' + conditionValue0
              }

              for (let r = str; r <= edr; r++) {
                for (let c = stc; c <= edc; c++) {
                  let func = formulaTxt
                  let offsetRow = r - str
                  let offsetCol = c - stc

                  if (offsetRow > 0) {
                    func = '=' + formula.functionCopy(func, 'down', offsetRow)
                  }

                  if (offsetCol > 0) {
                    func = '=' + formula.functionCopy(func, 'right', offsetCol)
                  }

                  let funcV = formula.execfunction(func)
                  let v = funcV[1]

                  if (typeof v != 'boolean') {
                    v = !!Number(v)
                  }

                  if (!v) {
                    continue
                  }

                  if (r + '_' + c in computeMap) {
                    computeMap[r + '_' + c]['textColor'] = textColor
                    computeMap[r + '_' + c]['cellColor'] = cellColor
                  } else {
                    computeMap[r + '_' + c] = {
                      textColor: textColor,
                      cellColor: cellColor,
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    return computeMap
  },
  updateItem: function(type, cellrange, format) {
    if (!checkProtectionFormatCells(Store.currentSheetIndex)) {
      return
    }

    let _this = this
    let index = getSheetIndex(Store.currentSheetIndex)

    //保存之前的规则
    let fileH = $.extend(true, [], Store.luckysheetfile)
    let historyRules = _this.getHistoryRules(fileH)

    //保存当前的规则
    let ruleArr
    if (type == 'delSheet') {
      ruleArr = []
    } else {
      let rule = {
        type: type,
        cellrange: cellrange,
        format: format,
      }
      ruleArr =
        Store.luckysheetfile[index]['luckysheet_conditionformat_save'] == null
          ? []
          : Store.luckysheetfile[index]['luckysheet_conditionformat_save']
      ruleArr.push(rule)
    }

    Store.luckysheetfile[index]['luckysheet_conditionformat_save'] = ruleArr

    let fileC = $.extend(true, [], Store.luckysheetfile)
    let currentRules = _this.getCurrentRules(fileC)

    //刷新一次表格
    _this.ref(historyRules, currentRules)

    //发送给后台
    if (server.allowUpdate) {
      server.saveParam('all', Store.currentSheetIndex, ruleArr, {
        k: 'luckysheet_conditionformat_save',
      })
    }
  },
  getHistoryRules: function(fileH) {
    let historyRules = []

    for (let h = 0; h < fileH.length; h++) {
      historyRules.push({
        sheetIndex: fileH[h]['index'],
        luckysheet_conditionformat_save:
          fileH[h]['luckysheet_conditionformat_save'],
      })
    }

    return historyRules
  },
  getCurrentRules: function(fileC) {
    let currentRules = []

    for (let c = 0; c < fileC.length; c++) {
      currentRules.push({
        sheetIndex: fileC[c]['index'],
        luckysheet_conditionformat_save:
          fileC[c]['luckysheet_conditionformat_save'],
      })
    }

    return currentRules
  },
  ref: function(historyRules, currentRules) {
    if (Store.clearjfundo) {
      Store.jfundo.length = 0

      let redo = {}
      redo['type'] = 'updateCF'
      redo['data'] = { historyRules: historyRules, currentRules: currentRules }
      Store.jfredo.push(redo)
    }

    setTimeout(function() {
      luckysheetrefreshgrid()
    }, 1)
  },
}

export default conditionformat
